一滚澜、進(jìn)程與線程
1粗仓、如何一句話描述操作系統(tǒng)在【硬件】與【軟件】之間的作用?
- 操作系統(tǒng)是連接【硬件】與【軟件】之間的橋梁
2、分別用一句話描述進(jìn)程和線程借浊?
- 【進(jìn)程process】進(jìn)程是線程的容器
- 【線程thread】線程是操作系統(tǒng)
運(yùn)行調(diào)度
的最小單位
- 【進(jìn)程】我們可以認(rèn)為塘淑,啟動(dòng)一個(gè)應(yīng)用程序,就會(huì)默認(rèn)啟動(dòng)一個(gè)進(jìn)程(有可能是多個(gè)進(jìn)程)
- 【線程】每一個(gè)進(jìn)程中蚂斤,都會(huì)至少啟動(dòng)一個(gè)線程來執(zhí)行程序中的代碼存捺,這個(gè)線程就是主線程
3、說一說單核操作系統(tǒng)是如何做到同時(shí)讓多個(gè)進(jìn)程(邊聽歌曙蒸、邊寫代碼捌治、邊查資料)同時(shí)工作呢?
- CPU的運(yùn)算速度非撑撸快肖油,它可以快速的在多個(gè)進(jìn)程之間迅速切換;
- 每個(gè)進(jìn)程都會(huì)獲得相應(yīng)的運(yùn)行時(shí)間片臂港,所以有一種同時(shí)運(yùn)行的錯(cuò)覺森枪;
4、打開Chrome瀏覽器审孽,每開一個(gè)tab疲恢,就可以從【活動(dòng)監(jiān)視器】里面觀察到新開了一個(gè)【進(jìn)程】。為什么Chrome要這么設(shè)計(jì)呢瓷胧?
- 這樣當(dāng)一個(gè)tab打開網(wǎng)頁卡死(可能是死循環(huán)代碼)后,不會(huì)導(dǎo)致整個(gè)Chrome卡死棚愤,不會(huì)影響其他tab的網(wǎng)頁運(yùn)行搓萧。
二、事件循環(huán)宛畦、微任務(wù)瘸洛、宏任務(wù)
1、我們經(jīng)常會(huì)說JavaScript是單線程
的次和,那為什么JavaScript處理定時(shí)器反肋、網(wǎng)絡(luò)請(qǐng)求這樣的操作不會(huì)卡死呢?
- JavaScript是單線程的踏施,但是瀏覽器是多線程的石蔗。
- JavaScript線程會(huì)把耗時(shí)操作交給其他線程處理(比如定時(shí)器的計(jì)時(shí)操作),等耗時(shí)操作完畢畅形,會(huì)把回調(diào)放入事件循環(huán)隊(duì)列中养距,JavaScript再從循環(huán)隊(duì)列取出回調(diào)進(jìn)行執(zhí)行。
- 如此形成一個(gè)閉環(huán)日熬,JavaScript線程也不會(huì)被耗時(shí)操作卡死棍厌。
image.png
image.png
2、事件循環(huán)中維護(hù)著哪兩個(gè)隊(duì)列?
- 【宏任務(wù)隊(duì)列】macrotask queue
- 【微任務(wù)隊(duì)列】microtask queue
- 【執(zhí)行順序】在執(zhí)行任何一個(gè)宏任務(wù)前耘纱,都會(huì)先查看并執(zhí)行微任務(wù)隊(duì)列中的任務(wù)敬肚。
3、兩個(gè)隊(duì)列中分別對(duì)應(yīng)放代碼中的哪些API任務(wù)束析?
- 【宏任務(wù)隊(duì)列】ajax艳馒、setTimeout、setInterval畸陡、DOM監(jiān)聽鹰溜、UI Rendering
- 【微任務(wù)隊(duì)列】Promis的then回調(diào)、queueMicrotask()
4丁恭、事件循環(huán)對(duì)兩個(gè)對(duì)象的優(yōu)先級(jí)是怎么樣的曹动?
- ① main script 中的代碼優(yōu)先執(zhí)行(編寫的頂層script代碼)
- ② 在執(zhí)行任何一個(gè)宏任務(wù)之前,保證微任務(wù)隊(duì)列是空的(優(yōu)先執(zhí)行微任務(wù)隊(duì)列中的任務(wù))
三牲览、面試題
1墓陈、面試題一【掌握】
image.png
setTimeout(() => {
console.log("setTimeout1");
new Promise(function (resolve) {
resolve();
}).then(function () {
new Promise(function (resolve) {
resolve();
}).then(function () {
console.log("then4");
});
console.log("then2");
});
});
new Promise(function (resolve) {
console.log("promise1");
resolve();
}).then(function () {
console.log("then1");
});
setTimeout(function () {
console.log("setTimeout2");
});
console.log(2);
queueMicrotask(() => {
console.log("queueMicrotask1");
});
new Promise(function (resolve) {
resolve();
}).then(function () {
console.log("then3");
});
- 解法核心
- ①promise構(gòu)造函數(shù)的代碼,不會(huì)被放在任何隊(duì)列中第献,而是在main script中
- ②將代碼分三塊進(jìn)行劃分【main script】【微任務(wù)】【宏任務(wù)】
- ③在執(zhí)行宏任務(wù)之前贡必,一定要清空微任務(wù)隊(duì)列里面的任務(wù)
2、面試題二【掌握】
image.png
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log("async2");
}
console.log("script start");
setTimeout(() => {
console.log("setTimeout");
}, 0);
async1();
new Promise(function (resolve) {
console.log("promise1");
resolve();
}).then(function () {
console.log("promise2");
});
console.log("script end");
- 解法核心
- ①async里面await后面的函數(shù)庸毫,相當(dāng)于promise的then(理解generator + yeild)
3仔拟、面試題三【太難,忽略】
image.png
4飒赃、node的事件循環(huán)【暫時(shí)跳過吧利花,用到再說】
image.png
image.png