[{"content":"福岡之旅 2026/04/09~13 04/09 湯布院 第一天搭星宇JX840到福岡機場大概中午，下飛機後搭高速巴士到由布院站，之後搭計程車到界 由布院放好行李就泡湯，泡湯完吃飯，吃飯完再去泡湯也沒什麼人挺舒服的，晚上一個人在戶外泡湯聽著蟲鳴鳥叫挺放鬆的，浴場外面雖然沒有牛奶可以喝，但是有冰棒跟蜂蜜水也是舒舒服服。\n04/10 湯布院 第二天在飯店吃完日是早餐，因為飯店說計程車要十點才有，我們就在房間裡面喝茶吃草莓，東摸摸西摸摸就到十點，搭計程車到金麟湖，有點失望就是一個水池而已，沿著湖走一走就去吃蕎麥麵當午餐，吃完午餐就逛由布院的商店街，還有去超市採買一些飲料水果，之後就回飯店吃飯、泡湯。\n04/11 福岡・博多 第三天在由布院車站附近逛一下買伴手禮，之後搭由布院之森到博多，到飯店check-in後就搭車到舞鶴公園看櫻花，但可惜晚了一週櫻花少了不少，之後就去博多阪急血拼，不過大部分都不是我要買的，就只是幫忙跑腿跟代購，分頭購買雙線作戰，還去超市買水果回飯店，稍微休息一下就又去藥妝店採購，買完藥妝回程路上在全家買宵夜，畢竟買到沒時間吃晚餐🥲。\n04/12 柳川・太宰府・自駕 第四天自駕，飯店吃完早餐後就往柳川開，中間還停了一個休息站買東西上廁所，到柳川預約好的船家繳費完就上船，不過沒想到整船除了一對加拿大夫妻還有船夫之外，全都是台灣人🤣，船夫一路唱歌一邊介紹，整體體驗還不錯，結束後開車到久留米吃懷石料理，經過7-11抽了兩發芙莉連一番賞(才300台幣)中了一個欣梅爾公仔😄，吃完午餐往天滿宮稍微逛一下就回博多繼續幫忙購物了，等把代購的都買完，才換我要去逛的運河城鋼彈基地，逛了好久但想鋼彈有點太佔空間，就只買兩盒限定的，後續又去天神的唐吉逛，好多韓國人@@而且一直撞人真的沒水準，買完後就回飯店收行李，隔天搭星宇JX841回台灣。\n後記 我覺得福岡是一個說走就走的地方，沒有東京快速新潮，沒有京都典雅的底蘊，但是方便快速，可以當作是後花園?!\n你的心就這麼大，盛滿了陽光，陰影自然就進不來。\n","date":"2026-04-22T00:00:00Z","image":"https://www.d0ngy3.com:443/p/2026fukuoka/title_hu_ba59d5c46a981134.jpeg","permalink":"https://www.d0ngy3.com:443/p/2026fukuoka/","title":"2026福岡"},{"content":"2026南山人壽臺北國道馬拉松 在大學有跑過幾次 10km，但是一直不敢挑戰，大概半年前開始慢跑，跑出心得越跑越快（？\n慢跑朋朋(x前輩(o，推薦報名這次的國道馬，然後開始訓練，原本預期應該可以輕鬆破二，因為平常都可以跑到 5:30，但這次剛跑到 2.5km 的時候膝蓋就痛了，後面只能慢慢跑，太痛就休息一下，斷斷續續的跑回終點完賽，不過也不差啦，至少知道我的下限在哪裡🤣，下次一定會更進步。\n","date":"2026-03-08T00:00:00Z","image":"https://www.d0ngy3.com:443/p/2026freewaymarathon/title_hu_15aed1422f26792.jpg","permalink":"https://www.d0ngy3.com:443/p/2026freewaymarathon/","title":"2026南山人壽臺北國道馬拉松"},{"content":"東京獨旅 2026/02/11~18 02/11 箱根 前一天住在松機旁邊的青旅，原本想說過海關後再吃飯，但我忘記台灣機場的東西貴又難吃 = =，之後上飛機轉火車一路趕車到箱根，旅館比想像中好兩晚3000而已，因為還不能 Check in 所以只能先寄放行李，然後再趕去下一個景點。\n下一站彫刻之森，下火車走個五分鐘就到了\n漂亮對吧，但爬上去爬到腳軟＠＠\n太陽下山就開始冷了，回到箱根湯本吃飯，吃完飯回青旅Check in\n之後去青旅旁邊的大眾溫泉泡湯，泡完來一罐牛奶，整體體驗極好。\n02/12 河口湖・自駕 第二天，記錄一下青年旅館，早餐是自助式好吃好看，環境採光也是舒服\n第一次在日本開車，而且還是一個人有點緊張，但大概開過一個路口就習慣了覺得還好，比台灣好開，之後跟著導航在山路飆車，開車到第一站，箱根神社\n路上遇到下雪，不過一下子而已，因為天氣沒有很冷\n到湖口湖的第一站是大石公園，但是剛好沒看到富士山有點失望，想說難得來可惜了，就去下一河口淺間神社，要去買伴手禮路上，居然看到富士山！！馬上路邊找地方停車，下車拍照\n之後到富士淺間神社打卡，不過停車超貴 1000日幣，而且不好開，不過來都來了停好車爬上去看看，拍完下山直衝富士吉田商店街，不過除了拍照也沒什麼，逛一下之後就去附近的 workman 逛逛\nworkman 有點類似迪卡儂的機能加上工裝的實用，不過也有一些剪裁不錯的，但是要在郊區的店比較齊全，最後一天在東京市區的 workman 東西少很多，也不好逛唯一的優點應該是可以退稅\n買完衣服發現有點來不及，飯也來不及吃，便利商店買點喝的一路飆車回小田原的租車店，在高速上開到 130 但居然還是被 k-car 海放超扯，我個人體感，日本高速相對於台灣需要更專注去開，但也可能是在國外開車比較緊張，還車完提著衣服還有伴手禮作火車回青旅\n02/13 高圓寺・吉祥寺・下北澤 第三天從箱根退房，預定是10點的浪漫特快到新宿，留了一點時間稍微逛一下箱根湯本，但是大部分商家都還沒開有點可惜，早餐是一樣的菜色不過一樣好吃，再次強調一晚1500\n新宿之後有點迷路一直沒辦法出車站，最後跟 jr 站務說我要付錢出去才成功逃離，到APA酒店一樣還不能 check in，所以寄放完行李就搭車到高圓寺，不過在新宿車站迷路有拖到時間，因此高圓寺就只在車站附近的商店街與氣象神社逛逛，逛完就搭車往吉祥寺\n到吉祥寺之後當然是去井之頭恩賜公園走走，天氣不錯很舒服人也不少，逛了一圈之後就到旁邊的商店街逛順便吃飯，路過天音買了鯛魚燒跟糰子，超讚，鯛魚燒外提夠脆，糰子軟糯醬汁調味鹹甜剛剛好，走到 Crêpe House Circus 想說買個試試，但是一堆人在排沒個半小時應該吃不到，所以就放棄，總的來說吉祥寺有的逛有的吃，滿推薦花時間來走走的\n下一站下北澤，出車站就滿滿文藝氣息，走到野獸宅邸一路上我的感受是，一堆低調有錢人房子都有個性跟品味，也沒什麼大樓，就是一個靜謐的居住區\n野獸宅邸有禁止攝影的牌子可以當指示物(確信\n朝聖完野獸宅邸，回到車站附近的商店街逛逛，順便朝聖孤獨搖滾\n這裡真的超級極文青，也可以花很多時間慢慢逛，不過我逛一天有點累了沒繼續逛\n搭到新宿走回 APA酒店路上，路過柏青哥店進去打了 1000日幣，花了點時間才弄懂玩法，其實本質就是彈珠台，我大概10分鐘就把錢打光了哈哈哈，賭博不好遠離賭博\n02/14 新宿・麻布台 第四天是美術館之旅，第一站根津美術館，但是太早到了所以在附近晃晃，遇到不少上班族\n根津美術館，主要是看他的庭園，但是展覽也不錯，特別是日本刀的展覽，選品佈置解說都很詳細，也不會有奇美博物館那種一堆展品，堆到像倉庫的感覺 = =，庭園中間有咖啡廳，一樣多人排隊\n接著從根津美術館走到國立新美術館，路上經過青山靈園，還有看到櫻花\n當期展覽 YBA\u0026amp;BEYOND: British Art in the 90s from the Tate Collection\n國立新美術館建築本體也是滿特別的，曲面玻璃帷幕，搭配清水模\n因為比預期的時間早，所以到附近的乃木神社晃晃，剛好遇到新人結婚，構圖太好了就拍了幾張\n乃木神社逛完之後，下一站到麻布台剛出車站，就看到路邊的櫻花還有東京鐵塔\n原本想買 Officine Universelle Buly 的護手霜，但實際看了之後覺得太浮誇，改買小香水套組，店員姊姊好用力在推薦我，一直試香，試完香水試護手霜，不過我覺得他家的護手霜太油了，最後這手寫姓名的標籤也太有儀式感了！之後去隅田屋買米，順便買一個飯糰，超厲害，那個米又Q又糯，粒粒分明但又不害太乾\nteamLab Borderless跟大家比較常去的豐洲不太一樣，裡面的互動還有場地真的夢幻，推推\n玩完 teamLab 肚子有點餓，看到 HARBS 麻布台之丘店 好像不用排隊，就進去點了兩個蛋糕跟紅茶，巧克力有點甜配紅茶剛好，水果千層奶油好吃，除了草莓其他水果都沒香味沒味道，可能不是當季吧有點可惜\n最後坐地鐵回新宿，走回飯店過程中經過大久保公園附近，一路上好像有不少站在路邊的女生，還有在旅館前的男生，看來這裡依舊是紅燈區，不過我發現這附近好像是韓國人的地盤，好多韓國餐廳還有韓國超市\n02/15 代官山・澀谷・原宿 第五天，坐地鐵到中目黑吃 I’m donut ? 當早餐，剛出車站就看到已經開始排隊了，在路邊吃甜甜圈，超好吃，外皮有點脆但內部是濕潤柔軟的搭配內餡，兩個字完美，路上好多人在慢跑 之後一路走到舊朝倉家住宅，但是太早還沒開，到旁邊晃晃看到旁邊牌子才知道，原來這區是 Hillside Terrace，難怪附近建築的空間，還有動線的規劃都跟一般街道不一樣，一路走到蔦屋書店稍微逛一下就往回走，等舊朝倉家住宅開門，不過有點失望，其實就是一個有庭院的大戶人家，很多地方都禁止進入，也沒什麼特殊物件，不推薦\n之後走到代官山的潮牌一條街，不過還沒開，所以我就去排 NUMBER SUGAR 買來當伴手禮，有單買幾顆先試吃，手工牛奶糖好吃，包裝漂亮不佔空間適合送禮，之後走到 Log Road 代官山 逛逛，除了甜點店還有啤酒廠，滿特特別的\n搭地鐵到渋谷，先到 BEAMS JAPAN 澀谷 逛逛，原本以為很大間好逛，但實際上滿小間的，之後走到 澀谷LOFT 整棟很多東西可以逛，再走到 澀谷PARCO 六樓的 任天堂 東京旗艦店，除了任天堂還有SEGA、哥吉拉等等 IP 的店\n有點累了就走到 藍瓶咖啡 澀谷 喝咖啡，深培咖啡但是不會太苦，休息一下後走到 伊良可樂 渋谷神宮前，喝起來就是味道豐富的氣泡飲料，有加檸檬酸酸甜甜的好喝，不過跟幾天前在下北澤自動販賣機的口味不太一樣，罐裝的會有一點薑味辣辣的\n往前走到 GR SPACE TOKYO 看看，偏向展示聽，有 GR 拍的作品，DM 也是 GR 的作品集，當然也有 GRIII、GRIIIx、GRIV、GRIV HDF、GRIV Monochrome 等實機可以試用\n最後在逛了一下 niko and \u0026hellip; 、 3COINS 、 HARAKADO 、 Danton 、 COLUMBIA 、 North Face 、 JAM VINTAGE＆SELECT，逛了很多但最後只買了兩件衣服就回新宿了😂\n最後一天在新宿，找了旁邊的 24h 澡堂テルマー湯去泡澡，跟箱根的澡堂感覺又不一樣，除了泡湯還有吃飯跟休閒的地方，比較像是放鬆的地方，不過休息區一堆人在睡覺打呼= =，我以也是照慣例泡湯完 shot 掉一罐咖啡牛奶，爽！然後去餐廳吃點東西當宵夜，吃在休息區耍廢一下就回酒店整理行李\n02/16 上野・淺草・神樂坂 第六天從新宿退房，坐地鐵到淺草，一樣是 APA飯店，一樣是先寄放行李，然後就往淺草寺走，先到淺草文化觀光中心拍照，確實是個拍照的好地方，然後到淺草寺逛逛拍拍，人超多台灣人也很多 = =，可能是因為除夕吧都出國到日本，\n下一站到神保町朝聖鏈鋸人蕾潔篇，電話亭沒有菊花了QQ，還有蕾潔上班經過的那些路，當然也有咖啡廳，不過是那種傳統日式咖啡廳，可以抽煙煙味很重，咖啡是用超市賣的業務用咖啡加冰塊倒給你，旁邊好像是上班族邊抽煙邊吃飯\n神保町這區好像很多上班族，不少快餐店，但是也有補習班，還有賣書的，滿特別的商業區\n下一站，神樂坂先到赤城神社，很特殊的神社，玻璃帷幕與傳統木構組成的建築主體，旁邊還有咖啡廳\n走到 Atelier Kohta 發現沒什麼人，就進去點了甜點跟一杯咖啡，進店的第一個感覺是普普啊，過譽的網美店吧東西點大概十幾分鐘才上，但是到看到甜點那一刻就打臉了，這麼浮誇難怪等很久，也真的很好吃，從奶油、餅乾、冰淇淋都完美不會太甜\n吃完甜點就一路逛到東京大神宮，超扯超多女生，大概九成都女生，看來很靈驗，我也抽了個吉🤣\n下一站日暮里，主要是看看谷中銀座，生活感很強的商店街，但是滿小的不太適合花時間來，除非沒其他地方可以逛再來\n搭車回淺草，經過秋葉原去 MILK SHOP LUCK 酪買一罐牛奶喝，喝不出什麼特別的但感覺很新鮮，路上看到晴空塔滿漂亮的\n02/17 上野・銀座・秋葉原 第七天，第一站上野阿美橫商店街，一樣太早到店都還沒開，不過我看了一下好像就跟其他商店街差不多，接著往上野恩賜公園走\n一路上好多櫻花，特別是五條天神社・花園稲荷神社，開得很美\n最後到上野東照宮，發現好多人在排隊，一查才發現剛好每個月17號是昇龍守的販售日，聽到限量當然是跟著一起排🤣\n下一站銀座逛街血拼形成，先到無印良品 銀座旗艦店整棟都是無印，東西齊全逛的好爽，接著到Workman Colors逛，我以為會跟富士吉田那間差不多，但實際上品類滿少的，也跟前幾天的單品不一樣，前一間偏向工作用，這間偏向家庭休閒，下一間Uniqlo Ginza Flagship Store，也是整棟都是 Uniqlo，不過人很多一堆體味很重的白人跟黑人在擠，逛的很躁 = =，稍微看一下就去秋葉原買hhkb了，鍵盤買完在秋葉原吃完飯就回淺草了\n02/18 淺草・台北 第八天，早上就從淺草退房因為是 12:00 的飛機，所以沒有其他行程，吃完早餐就往羽田機場走了，幸好淺草線可以一路搭過去不用轉車，順利搭上飛機回台灣\n後記 這八天的日本之旅，起源於從半年前因為發生一些事，所以定了過年的機票去日本，一路斷斷續續的研究收集資料，到出發前一週還覺得好多東西沒查好，一個人在國外自駕會不會太冒險，生病怎麼辦，但屁股坐上飛機到日本之後，覺得來都來了好好感受一切，允許一切發生，畢竟這跟人生一樣，你無法控制一路上會遇到什麼會失去什麼，能控制的就是自己的心態，用更正向的方式去活在當下，活在每一秒\n每一個不曾起舞的日子，都是對生命的辜負\n","date":"2026-02-22T00:00:00Z","image":"https://www.d0ngy3.com:443/p/2026tokyo/title_hu_f35d9cfd0a39ff43.jpeg","permalink":"https://www.d0ngy3.com:443/p/2026tokyo/","title":"2026東京"},{"content":"Proxmox VE 看影片經常看到 n8n 自動化，剛好有在 B60 上面有用 vllm 部屬一些模型(gpt-oss-20b、bge-m3、whisper-large-v3-turbo)，就用這些兜了兩個工作流。 n8n 部屬過程 n8n docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 services: n8n: image: n8nio/n8n:latest container_name: n8n ports: - \u0026#34;5678:5678\u0026#34; volumes: - ./n8n_data:/home/node/.n8n - ./n8n_file:/home/node/.n8n-files restart: unless-stopped environment: - N8N_BASIC_AUTH_ACTIVE=true - N8N_BASIC_AUTH_USER=user - N8N_BASIC_AUTH_PASSWORD=user - N8N_SECURE_COOKIE=false - NODES_EXCLUDE=\u0026#34;[]\u0026#34; # mkdir -p /root/.n8n/tools \u0026amp;\u0026amp; wget -qO- https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz | tar -xJ --strip-components=1 -C /root/.n8n/tools # /root/.n8n/tools/ffmpeg intel B60 模型部屬 gpt-oss-20b 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 $ sudo docker pull intel/llm-scaler-vllm:1.2 $ sudo docker run -td \\ --privileged \\ --net=host \\ --device=/dev/dri \\ --name=llm-container \\ -v ../models/:/llm/models/ \\ -e no_proxy=localhost,127.0.0.1 \\ -e http_proxy=$http_proxy \\ -e https_proxy=$https_proxy \\ -p 8000:8000 \\ --shm-size=\u0026#34;8g\u0026#34; \\ --entrypoint /bin/bash \\ intel/llm-scaler-vllm:1.2 $ sudo docker restart llm-container $ sudo docker exec -it llm-container bash VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 \\ VLLM_WORKER_MULTIPROC_METHOD=spawn \\ python3 -m vllm.entrypoints.openai.api_server \\ --model /llm/models/gpt-oss-20b \\ --served-model-name gpt-oss-20b \\ --dtype=bfloat16 \\ --enforce-eager \\ --port 8000 \\ --host 0.0.0.0 \\ --trust-remote-code \\ --gpu-memory-util=0.7 \\ --no-enable-prefix-caching \\ --max-num-batched-tokens=2048 \\ --disable-log-requests \\ --max-model-len=4096 \\ --block-size 64 \\ --api-key 1234 \\ -tp=1 # 占用 13.3 GB # 測試 $ curl http://localhost:8000/v1/chat/completions \\ -H \u0026#34;Content-Type: application/json\u0026#34; \\ -H \u0026#34;Authorization: Bearer 1234\u0026#34; \\ -d \u0026#39;{ \u0026#34;model\u0026#34;: \u0026#34;gpt-oss-20b\u0026#34;, \u0026#34;messages\u0026#34;: [{\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;簡短自我介紹。\u0026#34;}] }\u0026#39; bge-m3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 $ sudo docker pull intel/llm-scaler-vllm:1.2 $ sudo docker run -td \\ --privileged \\ --net=host \\ --device=/dev/dri \\ --name=emb-container \\ -v ../models/:/llm/models/ \\ -e no_proxy=localhost,127.0.0.1 \\ -e http_proxy=$http_proxy \\ -e https_proxy=$https_proxy \\ -p 8001:8001 \\ --shm-size=\u0026#34;1g\u0026#34; \\ --entrypoint /bin/bash \\ intel/llm-scaler-vllm:1.2 $ sudo docker restart emb-container $ sudo docker exec -it emb-container bash VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 \\ VLLM_WORKER_MULTIPROC_METHOD=spawn \\ python3 -m vllm.entrypoints.openai.api_server \\ --model /llm/models/bge-m3 \\ --served-model-name bge-m3 \\ --task embed \\ --dtype=float16 \\ --enforce-eager \\ --port 8001 \\ --host 0.0.0.0 \\ --trust-remote-code \\ --disable-sliding-window \\ --gpu-memory-util=0.1 \\ --no-enable-prefix-caching \\ --max-num-batched-tokens=2048 \\ --disable-log-requests \\ --max-model-len=2048 \\ --block-size 64 \\ --api-key 1234 \\ -tp=1 # 占用 1.1 GB whisper-large-v3-turbo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 sudo docker pull intel/llm-scaler-vllm:1.2 sudo docker run -td \\ --privileged \\ --net=host \\ --device=/dev/dri \\ --name=stt-container \\ -v ../models/:/llm/models/ \\ -e no_proxy=localhost,127.0.0.1 \\ -e http_proxy=$http_proxy \\ -e https_proxy=$https_proxy \\ -p 8002:8002 \\ --shm-size=\u0026#34;1g\u0026#34; \\ --entrypoint /bin/bash \\ intel/llm-scaler-vllm:1.2 sudo docker restart stt-container sudo docker exec -it stt-container bash VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 \\ VLLM_WORKER_MULTIPROC_METHOD=spawn \\ python3 -m vllm.entrypoints.openai.api_server \\ --model /llm/models/whisper-large-v3-turbo \\ --served-model-name whisper-large-v3-turbo \\ --task transcription \\ --dtype=float16 \\ --enforce-eager \\ --port 8002 \\ --host 0.0.0.0 \\ --trust-remote-code \\ --disable-sliding-window \\ --gpu-memory-util=0.2 \\ --no-enable-prefix-caching \\ --max-num-batched-tokens=2048 \\ --disable-log-requests \\ --max-model-len=2048 \\ --block-size 64 \\ --api-key 1234 \\ -tp=1 # 占用 1.6 GB n8n 工作流 簡單的 RAG，從自己 host 的 S3(minio) 讀 obsidian 筆記，接著用 bge-m3 做 embedding，目前的資料量大約需要跑半個小時，之後就可以讓 gpt-oss-20b 透過 RAG 去回答問題。 從 RSS link 下載 Podcast 後呼叫 host 的 ffmpeg 將 mp3 裁減為合適大小與格式(25 Sec, wav)，之後透過 whisper-large-v3-turbo 轉為文字，最合後並為一個檔案存到本地。 ","date":"2026-01-23T00:00:00Z","image":"https://www.d0ngy3.com:443/p/n8n/title_hu_7685f2624980e9c9.png","permalink":"https://www.d0ngy3.com:443/p/n8n/","title":"n8n"},{"content":"Intel® Arc™ Pro B60 Graphics Intel Arc Pro B60 是一款專為 AI 推論與專業工作站設計的顯示卡，採用最新的 Xe2 (Battlemage) 架構。其核心優勢在於配備了高達 24GB 的大容量視訊記憶體，極大優化了本地大型語言模型 (LLM) 的運行能力。\n另外也支持vGPU，也就是可以模擬多張虛擬顯卡在虛擬機中作圖形加速，或是影片編解碼，不過這部份稍微麻煩，我還沒有試過，等相關驅動穩一點再來試。\nIntel Arc Pro B60 規格表 規格項目 詳細參數 架構 Xe2 (Battlemage) Xe-cores 20 光線追蹤單元 (RT Units) 20 AI 引擎 (XMX Engines) 160 Xe 向量引擎 160 核心時脈 (Base/Boost) 2000 MHz / 2400 MHz FP32 算力 12.28 TFLOPS INT8 AI 算力 197 TOPS 記憶體容量 24 GB GDDR6 記憶體介面 192-bit 記憶體頻寬 456 GB/s 記憶體速率 19 Gbps 匯流排介面 PCIe 5.0 x8 功耗 (TBP) 200 W 影像輸出 4x DisplayPort 2.1 (支援最高 8K@60Hz) 影音編碼 支援 AV1, H.264, H.265 (HEVC) 硬體編、解碼 簡單開箱與安裝 因為是專業卡，所以沒什麼包裝，就是單純靜電袋包起來放到盒子沒什麼好看的，供電的話一個PCIe 8-pin而已 雙卡系統，上面是京東啟動的 5070ti，CPU 是 R7-9700x，RAM DDR5-6000 16G*2(當時只要3000，現在都破萬了\u0026hellip;)，Power 1200w。 Windows 測試 因為我買 Intel arc Pro B60 是為了跑 llm，所以只在 Windows 虛擬機稍微測試，以下數據僅供參考:\n環境: Win11 25H2 虛擬機(PVE 9.1.2)，Intel arc Pro B60 直通虛擬機 Driver 使用官網最新版本，裝完就可以用了 Linux 測試 Linux 就處理比較久，由於新卡加上 Intel 資料較少，一開始用官方 ipex-llm的 ollama 教學但是是了三天還是跑不起來 ，後來照著官方vllm的教學就跑起來了，目前同時跑 GPT-OSS 20b 跟 bge-m3。\n補充一下，Linux目其沒有監控 Intel B60 的軟體，nvtop跟intel_gpu_top都沒辦法正確讀到資訊。\n","date":"2025-12-23T00:00:00Z","image":"https://www.d0ngy3.com:443/p/b60/index_hu_c587579954121660.png","permalink":"https://www.d0ngy3.com:443/p/b60/","title":"Intel® Arc™ Pro B60"},{"content":"香港獨旅 11/22 搭香港快捷，一進機場大廳就聞到香味，後來查才知道真的有香薰(白茶薑)，因為到香港機場已經16:00，所以直接座機場快線轉荃灣線到尖沙咀的青旅，路過k11剛好有富豪雪糕。\n吃完冰直接到撲撲旅社checkin放行李，環境還不錯只少乾淨。 之後開始覓食，從最近的hashtagB開始，帶上一個原味一個開心果口味的蛋塔往佐敦走，一邊吃一邊走路上遇到一個問路的外國人，啊不是，我也不是本地人啊!?\n走到澳洲牛奶公司剛好把兩個蛋塔吃完，蛋塔還不錯吃啦塔皮很酥，不過開心果的濃到有點齁，可能是時間的比較晚，沒有排隊就入座了，點了西多士跟鴛鴦奶茶，不知道為啥奶茶帶點酸，加一堆糖才壓下去，吐司烤的很好吃，外面是酥脆內部還是鬆軟帶熱氣超讚。\n吃完就繼續往前走到佳佳甜品，點了核桃露拼杏仁露，不錯啦，不會稀不會太濃剛好順口，可是好像沒有別驚艷，青柑普洱是在B站看好多次了路邊買來喝喝看的。\n吃飽喝足就往下一站 Eyebar 前進，路上經過無印進去逛發現一些商品台灣都沒有，逛完繼續走，然後又遇到富豪雪糕，當然再來一支，旁邊有蜜雪冰城原本想點手打檸檬茶但是沒有檸檬了，改點珍珠奶茶，我必須強烈譴責，我從沒有吃過如此軟爛了珍珠，口感跟泡了8個小時的湯圓一樣軟爛，加上紙吸管，口感奇差。\nEyebar 雖然低消不便宜但是風景真的很棒，天氣剛好吹吹風又不會太冷，一個人點兩杯飲料慢慢喝邊看維多利亞港的夜景，這應該是我這趟香港行印象最深的一個地方，再走到星光大道晃晃，之後回青旅休息。\n11/23 第二天，原本計畫要去一點心吃早餐，但是記錯時間沒開，所以直接到第一站堅尼地城 % Arabica，先來一杯冰美式，還不錯是偏苦甜的風味，店員也是挺chill的慢慢做，坐在路邊吹吹海風，發現有好多人在慢跑。\n接著坐叮叮車到禧利街站，實在太餓了看到旁邊貳號冰室就進去點的菠蘿油跟鴛鴦奶茶，恩..鴛鴦奶茶還是有點酸味，菠蘿油好肥好爽，吃完肚子一陣絞痛，正絕望的時候看到旁邊往下的樓梯居然是公廁，進去解放一波後，不過裡面的設施不像是現代蓋的，查一下才知道原來威靈頓街地下公廁是現在香港最古老的公廁，又解鎖一個冷門景點。\n往大館走，經過元創方順便逛一下，大館逛完去排 bakehouse，bakehouse 的餡不甜很香好吃。\n之後坐地鐵往怪獸大廈，不過因為昨晚被同寢打呼聲吵到沒睡好，在地鐵上稍微瞇一下差點坐過站，不過實在太累了，到怪獸大廈% Arabica又喝了一杯冰美式才開始拍照，不過拍照的人好多都要排隊，也沒有到很別就真的是一個拍照的打卡點而已，隨便拍幾張就走了，有點後悔花這麼多時間跑來看。\n從太古坐地鐵到九龍，走了一段路才到 M+ 博物館，不過大部分都是在商場內不會太曬太陽，M+ 博物館應該也是我這趟香港數一數二印象深刻的景點，建築跟空間設計也是很多細節，連地板木紋磚跟通風口都有對齊，外面的草地很多人在野餐，總言之很適合花時間逛，這是一段慢下來的時刻，為生活充電。\n之後去旺角吃晚餐，路上又遇到富豪雪糕，當然再來一支，邊吃邊往餐廳走，吃完晚餐帶著一杯手打檸檬茶去星際城市看相機，路過曲奇四重奏順便把伴手禮買一買，有一說一蝴蝶酥真的好吃，咬下去奶香跟上面糖粒的脆甜口感一片接一片，不過貴也是真的貴但這是我的問題，逛完買完就回青旅休息，路上帶一杯霸王茶姬，普通的茉莉奶綠。\n11/24 第三天早起就退房搭地鐵去瑞記咖啡吃早餐，好吃，吃完早餐去兆成行挑香氛，可以現場試聞而且一瓶NTD 300 多而已，喜歡香氛的推薦去看看，之後去蘭芳園外帶絲襪奶茶，因為前一天經過的時候撲空，還好有再去一次真的好喝，奶香茶香甜度剛好完美平衡，之後去買伴手禮珍妮曲奇聰明小熊排了半個小時，排完時間差不多就搭機場快線去機場準備報到了，報到完還有時間就去麥當勞稍微吃一點，點了薯條跟奶昔，為什麼台灣麥當勞沒有奶昔!!吃完我看還有一點時間就去天際走廊看飛機，然後慢慢走去登機口，我沒想到居然還要坐電車才能到，我以為我班機前五分鐘到應該綽綽有餘，我是最後一個登機的ㄏㄏ。\n後記 回台灣後進到機場大廳一股又濕又悶的空氣衝擊我的鼻腔，我想為為什麼台灣不能學香港機場大廳的香氛，至少廁所要有香氛吧!!然後過海關前的廣告都是政府中文的觀光廣告，到底是要給誰看，醜就算了至少也用英文吧!! 八達通真的方便，台灣的電子支付到底什麼時候才能跟上，我在香港基本用手機的 apple pay 到處刷，不太用掏錢包。\n過兩天就看到香港就發生大火，願生者平安，逝者安息。\n","date":"2025-11-22T00:00:00Z","image":"https://www.d0ngy3.com:443/p/2025hongkong/title_hu_f415b2b72801e7a0.jpg","permalink":"https://www.d0ngy3.com:443/p/2025hongkong/","title":"2025香港"},{"content":"Yocto 使用紀錄 什麼是 Yocto Yocto 是一個 用來建立客製化 Linux 發行版 的開源專案。它不是一個 Linux 發行版本身，而是一套 工具與框架，幫助開發者針對特定硬體平台（例如嵌入式系統）生成完整的 Linux 系統映像檔（image）。 Yocto是一個開源專案，它提供了一套工具和方法來為嵌入式系統建立客製化、輕量級的Linux發行版。 它包含核心元件如負責處理任務和建構的BitBake，以及為OpenEmbedded系統提供基礎的OpenEmbedded-Core層。 透過Yocto，開發者可以選擇軟體組件、調整配置，並建立出適合特定硬體（如物聯網設備、AI邊緣設備等）的Linux映像檔。 Yocot 歷史 Yocto計劃，一個自由軟體專案計劃，由Linux基金會於2010年宣布，這個計劃的目標在於創造出可以提供嵌入式linux發行版的軟體工具，以改善軟體發展流程。2011年3月，這個計劃與OpenEmbedded計劃結合，以OpenEmbedded-Core計劃作為計劃的另一個名稱。 安裝與構建最小映像步驟 1. 安裝依賴套件 Ubuntu / Debian requirement 1 sudo apt-get install build-essential chrpath cpio debianutils diffstat file gawk gcc git iputils-ping libacl1 liblz4-tool locales python3 python3-git python3-jinja2 python3-pexpect python3-pip python3-subunit socat texinfo unzip wget xz-utils zstd 另外要安裝 qemu，參考 qemu 官網 2. Clone Poky Use Git to Clone Poky 1 git clone git://git.yoctoproject.org/poky 需要確保已啟用地區設定：en_US.UTF-8 1 2 locale --all-locales | grep en_US.utf8 sudo dpkg-reconfigure locales 3. 指定 branch，開始構建最小 image 並使用 qemu 模擬 1 2 3 4 5 6 7 8 cd poky git branch -a git checkout -t origin/walnascar -b my-walnascar git pull source oe-init-build-env x64 bitbake core-image-minimal runqemu qemux86-64 nographic 接著使用 root 登入，poweroff退出 qemu 為 image 增加實用的套件 meta-oe list 包含linux 常用的一些工具像是 iproute2 vim nano pciutils 1 2 3 4 cd poky git clone git://git.openembedded.org/meta-openembedded git checkout -t origin/walnascar -b my-walnascar git pull 在bblayers.conf增加 1 meta-openembedded/meta-oe 在local.conf 增加 1 IMAGE_INSTALL:append = \u0026#34; htop iproute2 vim nano pciutils\u0026#34; 增加 coreutils 在local.conf 增加 1 IMAGE_INSTALL:append = \u0026#34; coreutils\u0026#34; 增加 util-linux 在local.conf 增加 1 IMAGE_INSTALL:append = \u0026#34; util-linux\u0026#34; 增加 man-db、man-page 在local.conf 增加 1 IMAGE_INSTALL:append = \u0026#34; man-db man-page\u0026#34; 增加 C tool packagegroup-core-buildessential類似於 Debian/Ubuntu 系統中的 build-essential 套件，包含 gcc, g++, make, cpp, libgcc, libstdc++, kernel-dev, pkgconfig 在local.conf 增加 1 IMAGE_INSTALL:append = \u0026#34; packagegroup-core-buildessential gdb\u0026#34; 增加 lsb-release 在local.conf 增加 1 IMAGE_INSTALL:append = \u0026#34; lsb-release\u0026#34; Creat ISO 在local.conf 增加 1 2 3 4 5 IMAGE_INSTALL:append = \u0026#34; grub-efi syslinux\u0026#34; IMAGE_FSTYPES:append = \u0026#34; wic iso\u0026#34; WIC_CREATE_ISO = \u0026#34;1\u0026#34; IMAGE_BOOT_FILES += \u0026#34;efi/boot/*\u0026#34; IMAGE_FSTYPES += \u0026#34;iso\u0026#34; 在bblayers.conf增加 1 meta-yocto-bsp 用 qemu 執行 iso 1 2 3 4 5 qemu-img create -f qcow2 ./HD.qcow2 4G qemu-system-x86_64 -cpu EPYC -smp 2 -m 2048 -device virtio-scsi-pci,id=scsi0 -device scsi-hd,bus=scsi0.0,drive=main_disk -drive id=main_disk,file=./HD.qcow2,if=none,format=qcow2 -cdrom ./tmp/deploy/images/genericx86-64/boom-image-genericx86-64.rootfs.iso -net nic,model=virtio -net user -nographic qemu-system-x86_64 -cpu EPYC -smp 2 -m 2048 -device virtio-scsi-pci,id=scsi0 -device scsi-hd,bus=scsi0.0,drive=main_disk -drive id=main_disk,file=./HD.qcow2,if=none,format=qcow2 -net nic,model=virtio -net user -nographic 選擇 Serial console install 出現 Please select an install target or press n to exit ( sda ): 時，輸入 sda 後按 Enter ","date":"2025-10-16T00:00:00Z","image":"https://www.d0ngy3.com:443/p/buildyocto/title_hu_766cae9c11dce276.jpg","permalink":"https://www.d0ngy3.com:443/p/buildyocto/","title":"yocto 筆記"},{"content":"第二次露營，搭完帳看個書就開始下雨🥲，煮完晚餐開始暴雨，只能滾進帳篷吃飯，還好隔天沒有繼續暴雨，順利收帳\n","date":"2025-09-10T00:00:00Z","image":"https://www.d0ngy3.com:443/p/camping0002/title_hu_c7c76ff5fc2e3c8d.JPG","permalink":"https://www.d0ngy3.com:443/p/camping0002/","title":"大露營大成功!"},{"content":"第一次單人大露營大成功！最近重追搖曳露營就想試試單人露營，裝備準備好營地找好衝了，新竹好多露營區，騎車1個小時就到了，整趟舒舒服服放鬆好讚。\n以下技術總結：要有營錘不然手會痛，吃的不要準備太多，奶油要冰= =，防曬要注意= =，碳烤杏鮑菇跟油豆腐讚讚，烤麵包讚讚\n","date":"2025-08-25T00:00:00Z","image":"https://www.d0ngy3.com:443/p/camping0001/title_hu_c7c76ff5fc2e3c8d.JPG","permalink":"https://www.d0ngy3.com:443/p/camping0001/","title":"大露營大成功!"},{"content":"Computex 2025 紀錄一下第一次參觀 Computex，覺得收穫頗多，未來應該會請假參加\nGIGABYTE 第一站 GIGABYTE 第一眼看到的就是黃爸爸的簽名當然要記錄一下，後面發現整個會場一堆簽名= = 展區滿大一部分是跟水冷有關 有看到一個 CXL 的記憶體模組，是 SMART Modular世邁科技 的產品 ，簡單的說卡上有 IC 將DDR5 DIMM 轉為 PCIe 協議，host CPU 透過 PCIe 去 access。 2U 尺寸的 4node server 與 E1.S 規範的 SSD UTran 這間應該是收穫最多的攤位，一開始是因為看到 Gen6 的 Switch，問一下才知道目前沒有 Gen6 的 Device 所以是用兩個 Gen6 Switch 對接跑 Broadcom 的 tool，另外那個線材是 3M 的 0.75M，經過這麼長的cable 訊號還是可以滿厲害的 另外原來祥碩 2024 也說要做 Gen4 的 PCIe Switch 但是就沒有然後了，還有另外一間Xconn 也有做 PCIe Switch，但是還不能用，所以目前市場還是只有 Broadcom 一家能用 另外他們家的 Gen5 產品 synology 沒特別去看 synology，只隨手拍企業級的 NAS G.Skill 芝奇的超頻舞台 intel 主要是展示 intel Arc 在 AI 方面的應用，但是眾所周知 intel 連 AMD GPU 都打不過，所以在 LLM 與 AI 生圖都沒有多特別，展場的人員感覺也沒有多了解相關的資訊，問不到想要的資訊，展示用的軟體也遇到 BUG(顯存不足，但實際是夠的)，嘖嘖。 btw 這是現場用的展示軟體 AI-Playground ASUS 華碩一堆筆電產品 Server 相關相對沒有那麼多 ASUS 做的 NVIDIA DGX™ Spark 主要看到比較特別的是這個 GB300 工作站，應該就是 NVIDIA DGX™ Station NVIDIA GB300 Grace Blackwell Ultra Desktop Superchip MediaTek NVIDIA DGX Spark CPU 與 GPU 之間透過 NVLink Fusion 頻寬約 700GB/s，這個架構是可以拓展的，另外網卡是 CX7 但是只有 x4 另外還有一個雲遊戲的解決方案，這上面共有 10 顆 SOC 透過網路連接並管理 當時看不懂，後來才知道這是的224G SerDes IP，很猛的 ASRock 主要是看一些加速卡還有工業應用 Pegatron 我在整理才發現是和碩\u0026hellip; inventec AIC CXL 的另一種應用，Host CPU 透過 HBA 卡連接到這個 server 的 Xconn CXL switch，就能夠透過 PCIe access，可以有多個 Host CPU 共用這個 SSD 存儲池 實際的應用，搭配 Nviadia 的 DPU 快速裝卸載資料 VAST VAST Data 的旗艦產品為 VAST Data Platform，這是一個\u0026quot;統一的軟體平台\u0026quot;，結合了儲存、資料庫與運算功能，專為 AI 和深度學習應用設計。 其核心架構為 DASE（Disaggregated and Shared Everything），這種架構將運算邏輯與系統狀態解耦，並引入新的共享與交易型資料結構，為下一代 AI 計算奠定基礎。 Supermicro Supermicro 不給拍照，想問看裡面也不行，想問一下也不理，不過旁邊拿著相機的外國人就可以跟工作人員拿螺絲起子拆機箱拍照，ㄏㄏ。 PHISON 主要是看aidaptiv+ 目前理解就是 M2 SSD 只是軟體驅動有特別處理，硬體應該任何 PC 都可以。 目前應該只有 Gigabyte 有產品 AI TOP 100E SSD 1TB 不過居然只有 Gen4 x4 ??? Kneron kneron 原本滿期待的想了解，但是現場的 PM 跟 RD 好像不懂我想問的，我問可以跑多大的影像辨識模型，是用什麼格式是 fp16 還是量化的 int8，結果只跟我說可以辨識 640 x 640，好喔。 Andes 晶心科 Andes，主要是做 RISC-V 現場只展出 Linux Demo，沒特別的除了 CPU 以外的 IP 都是用 synopsys 的。 LampAI 神燈智能科技 主要是做企業本地部屬大模型。 GSN GSN GPU 租賃平台，太多槽點(數據安全、隱私、連線速度)，有點像詐騙\u0026hellip;當然也有可能是我不懂 Graid Graid，SupremeRAID™ 是基於 GPU 的軟件定義 RAID 解決方案，旨在提供最高的固態硬盤性能，而不會佔用 CPU 週期或造成吞吐量瓶頸。不就是 GPUDirect Storage 可能是我不懂，可能還有其他特別的技術吧 = = Amphenol 線材!! XS-Labs 韓國公司 ARM base 的 server maxsun 這個是 intel B60 48G上面沒有 PCIe Switch 所以需要主版拆分 另外跟負責 Nvidia 顯卡的 PM 聊了一下，他覺得 CUDA 還是太強大，AMD 還是無法撼動，但是最近 AMD 出的 AI Max+ 395 有點有趣搞不好可以打破平衡，但是目前主要問題還是太貴 LR-LINK 因為有買過他們家的產品，想說了解一下最新的產品，沒想到現場的人挺敷衍的ㄏㄏ，我問目前 Gen4 Switch 有支援那些 mode，他說都有支援，可是我問你家 RD 可不是這麼說的還說 Gen4 只有兩種 mode VIA Labs VIA Labs 是 VIA 的全資子公司，做 USB 起家的，主要是 USB Hub 的 solution IC，包含 DP1.4，PD 2.1 等 USB 相關。 ","date":"2025-05-21T00:00:00Z","image":"https://www.d0ngy3.com:443/p/cpx25/title_hu_1860d5826ffe7c34.JPG","permalink":"https://www.d0ngy3.com:443/p/cpx25/","title":"Computex 2025"},{"content":"描述 不需要鑽孔、攻絲，只透過簡單的螺絲搭配固定件進行組立。\n所有零件 編號 零件名稱 描述 數量 連結 1 2020鋁擠型x510 必要 8 link 2 2040鋁擠型x850 必要 4 link 3 18U立柱 必要 4 link 4 L板 必要 20 link 5 L擠 必要 8 link 6 M8板 必要 4 link 7 I板 必要 4 link 8 M5x8 必要 112 link 9 萬向輪 必要 4 link 10 板托 非必要 8 link 11 L插 非必要 8 link 12 托盤 非必要 2 link 3D 模型 實際圖 refer Intel Server Rack Cabinet Compatibility Guide 铝型材机柜材料清单 - jxphzxm | 小红书 铝型材机柜尺寸和材料 - 猫猫穗穗 RM400 4U case 3D file ","date":"2025-01-05T00:00:00Z","image":"https://www.d0ngy3.com:443/p/rack/title_hu_d6b75a48c72b4d79.JPG","permalink":"https://www.d0ngy3.com:443/p/rack/","title":"18U rack Server"},{"content":"Proxmox VE 看影片經常看到 PVE 相關的教學，但因為手邊沒有零件可以用來玩，所以一直沒玩過。趁這次有板子來玩玩順便紀錄。 PVE 安裝過程 先到 PVE 官網下載 ISO，接著跟一般裝系統一樣，把 ISO 用 Rufus 或其他軟體製作 USB 開機碟，然後用 USB Boot，注意 BIOS 需要關閉 Secure Boot。 有遇到無法安裝在 emmc，照著解法成功安裝。大致步驟如下： 在最初畫面選 Advanced Options 然後進入 Debug Mode 出現第一個 Shell 的時候輸入 exit 或 Ctrl+D 退出 當 Shell 為 Root 時編輯 /usr/share/perl5/Proxmox/Sys/Block.pm，為添加 emmc elsif 1 2 3 4 5 6 7 } elsif ($dev =~ m|^/dev/nvme\\d+n\\d+$|) { return \u0026#34;${dev}p$partnum\u0026#34;; } elsif ($dev =~ m|^/dev/mmcblk\\d+$|) { return \u0026#34;${dev}p$partnum\u0026#34;; } else { die \u0026#34;unable to get device for partition $partnum on device $dev\\n\u0026#34;; } 修改完後依照正常流程安裝 安裝成功!! 一開始想用 USB WiFi 當管理網卡，但是連不上網後來就放棄，乖乖用有線網卡。 原本要裝 Ubuntu 24.04 Desktop，但太吃資源就改裝 Server 版，因為想跟 Mac 有一樣的操作所以額外裝了Homebrew Cloudflare 設定 使用 Tunnel 做穿透，搭配 Zero Trust 設定 Access 的應用程式管理存取權限，比直接把應用暴露在公網上安全，設定起來也方便，可以參考官網設定、範例1、範例2 Cloudflare Access 設定: 範例 1, 範例 2 大概架構： 1 2 3 +------+ +---+ +----------+ +----------+ |Ubuntu|--\u0026gt;|PVE|--Tunnel--\u0026gt;|Cloudflare|--\u0026gt;|WebSSH APP| +------+ +---+ +----------+ +----------+ mac os install 安裝 Mac OS 基本依照zhuyuan大大所教學的，但是後續會遇到 reboot 後卡在 menu，網路上是說修改 config.plist，但是我在 PVE Mac OS 中找不到 config.plist，Win11 可以用 7-zip 開 OpenCore-v21.iso 但是無法編輯，我的解法如下。\n根據isseu 需要修改config.plist中兩個位置 1 2 MISC/Security/AllowSetDefault = true MISC/Boot/Timeout = 5 先用 7-zip 開啟OpenCore-v21.iso\\EFI\\OC\\config.plist 確認要修改的位置，舉例來說AllowSetDefault 在 1066，Timeout 在 1040 在選單介面選 UEFI Shell 進入後選擇OpenCore-v21.iso掛載的位置(應該是第一個)，我這邊是FS7:，接著使用編輯器edit EFI\\OC\\config.plist 按F1跳轉到 1066 與 1040 修改值，修改完後按F3儲存按y確認 最後在 UEFI Shell exit 退出，reboot 後就會自動從預設值啟動 ","date":"2025-01-05T00:00:00Z","image":"https://www.d0ngy3.com:443/p/pve/title_hu_d29c15c91efba6aa.JPG","permalink":"https://www.d0ngy3.com:443/p/pve/","title":"Proxmox VE"},{"content":"匯流排 USB 通用序列匯流排（英語：Universal Serial Bus，縮寫：USB）是連接電腦與裝置的一種序列匯流排標準，也是一種輸入輸出(I/O) 連接埠的技術規範，廣泛應用於個人電腦和行動裝置等資訊通訊產品，並擴展至攝影器材、數位電視（機上盒）、遊戲機等其它相關領域。 多媒體電腦剛問世時，外接式裝置的傳輸介面各不相同，如印表機只能接並列埠、數據機只能接RS232、滑鼠鍵盤只能接PS/2等。繁雜的介面系統，加上必須安裝驅動程式並重新開機才能使用的限制，都會造成使用者的困擾。因此USB應運而生。\n另外在主機板上有用於連接前面板的 Type-E 與 20pin\nPS/2 PS/2介面是一種PC相容型電腦系統上的介面，可以用來連結鍵盤及滑鼠。PS/2的命名來自於1987年時IBM所推出的個人電腦：PS/2系列。PS/2滑鼠連接通常用來取代舊式的序列滑鼠介面（DB-9 RS-232）；而PS/2鍵盤連接則用來取代為IBM PC/AT所設計的大型5-pin DIN介面。PS/2的鍵盤及滑鼠介面在電氣特性上十分類似，其中主要的差別在於鍵盤介面需要雙向的溝通。\nDIN連接器 DIN連接器是由德國標準化學會（DIN, Deutsches Institut für Normung e.V.）所制定的一項連接器標準。由於有太多DIN連接器標準，如果不附加編號（如\u0026quot;DIN 41524連接器\u0026quot;），DIN連接器一詞並不代表任何一種連接器。在消費電子產品中，\u0026ldquo;DIN連接器\u0026quot;通常代表由DIN所制定的圓形連接器家族的一個成員。DIN連接器最初用於類比音訊訊號的傳輸，這些連接器有些後來也被用於類比影片和數字介面，如MIDI或IBM PS/2介面鍵盤和滑鼠電纜。原來的DIN連接器標準已替換為等效的國際標準IEC60130-9。\nD-Sub連接器 D-Sub完整名稱為D-subminiature。因為從結構上來看像一個大寫的字母D，所以用“D”命名；又在連接器剛被發明之初，相對於當時的介面是最小的，故有了subminiature（超小型）的暱稱。這就是D-Sub接頭/連接器名稱的由來。\n目前較常見應該只剩 RS-232 在用的 DE-9\n影像介面 VGA端子 VGA（Video Graphics Array）端子是一種用於傳輸影像類比訊號的介面，廣泛應用於電腦顯示器、投影機等設備。它於1987年由IBM引入，曾經是電腦影像輸出的標準。\nDVI DVI（Digital Visual Interface）一種視訊介面標準，設計的目的是用來傳輸未經壓縮的數位化影像。由顯示業界數家領導廠商所組成的論壇：數位顯示工作小組(DDWG, Digital Display Working Group)制訂。DVI介面可以傳送未壓縮的數位視訊資料到顯示裝置。本規格部分相容於HDMI標準。\nDisplayPort DisplayPort（簡稱DP）是一個由PC及晶片製造商聯盟開發，影片電子標準協會（VESA）標準化的數位式視訊介面標準。該介面免認證、免授權金，主要用於視訊源與顯示器等裝置的連接，並也支援音訊、USB和其他形式的資料。 此介面的設計是為了取代傳統的VGA、DVI和FPD-Link（LVDS）介面。透過主動或被動轉接器，該介面可與傳統介面（如HDMI和DVI）向下相容。\nHDMI 高畫質多媒體介面（英語：High Definition Multimedia Interface，縮寫：HDMI）是一種全數位化影像和聲音傳送介面，可以傳送未壓縮的音訊及視訊訊號。HDMI可用於機上盒、DVD播放機、個人電腦、電視遊樂器、綜合擴大機、數位音響與電視機等裝置。HDMI可以同時傳送音訊和視訊訊號。音訊和視訊訊號採用同一條線材的設計大大簡化系統線路的安裝難度。\nRF F 連接器 F型連接頭是一種同軸射頻連接器，通常用於「空中傳播」的無線電視、有線電視以及普遍用於無線電視和cable modem，一般使用RG-6/U型電纜或者在較早安裝的裝置中常使用RG-59/U型電纜。這種連接頭是由Eric E. Winston於1950年代早期發明。\nN 連接器 N 型連接器是一種帶螺紋、防風雨的中型射頻連接器，用於連接同軸電纜。是最早能夠傳輸微波頻率信號的連接器之一，由貝爾實驗室的Paul Neill於1940年代發明，該連接器以他的名字命名。 最初，該連接器設計用於在軍事應用中傳輸頻率高達 1 GHz 的信號，但今天常見的 Type N 可以輕鬆處理高達 11 GHz 的頻率。\nC 連接器 C 連接器是一種用於端接同軸電纜的射頻連接器。C 連接器由 Amphenol 工程師 Carl Concelman 發明。它是防風雨的，不會過於笨重。\nBNC連接器 Bayonet Neill-Concelman 一種很常見的RF端子同軸電纜終端子。BNC連接器用於射頻訊號的傳輸，包含類比或數字影片訊號的傳輸、業餘無線電裝置天線的連接、航空電子裝置和其他的一些電子測試裝置的連接。 BNC連接器有50歐姆和75歐姆兩個版本。不同版本的連接器互相容，但如電纜阻抗不同，訊號可能出現反射。通常BNC連接器可以使用在4GHz或2GHz。 SMA 連接器 SMA (SubMiniature version A) 連接器是 1960 年代開發的半精密同軸射頻連接器，作為帶有螺紋式耦合機構(screw-on coupling)的同軸電纜的最小連接器介面。一般具有 50 Ω 阻抗值、 1/4 英寸直徑。\nHirose U.FL 連接器 廣瀨U.FL連接器是廣瀨電機所推出的微型同軸連接器，其他廠商又稱作Hirose U.FL, I-PEX MHF I, AMC or UMCC。U.FL 連接器通常用於小型設備，如在智慧型電話、手提電腦或者嵌入式系統裏面連接Wi-Fi、GPS天線。\nMMCX 連接器 MMCX接口是一種同軸射頻連接器，於1990年代研發，採用插入卡緊的連接方式，可以360度旋轉。通常其特性阻抗為50歐姆。MMCX接口常見於個人電腦的無線PC卡上的天線接口，和一些PDA和GPS導航設備的GPS通訊天線插口上。\nref https://www.blackbox.be/en-be/page/28882/Resources/Technical-Resources/buyers-guides/Connector-Guide/keyboard-video-and-audio-connectors\n","date":"2024-11-24T00:00:00Z","image":"https://www.d0ngy3.com:443/p/conn/title_hu_ffb016b89e111644.JPG","permalink":"https://www.d0ngy3.com:443/p/conn/","title":"Connector"},{"content":"入坑 【不止遊戲】一支影片教你取得無線電執照！ 携手软件定义无线电SDR走进神奇的无线电世界 接收国际空间站2024年首次SSTV活动，终于没有鸽了！ SDR++接收NOAA气象卫星云图，更简单更高效 这种乐趣估计只有少部分业余无线电爱好者才懂 Software Defined Radio (SDR) on Android Device 如何用树莓派搭个小电台 无线电猎狐：在基地不远的地方侦测到一个“黑广播” 耗时2个月辗转10个机场，我们终于拍到了！ 新手入門 業餘無線模擬考試 NCC 業餘無線電人員資格測試 台灣無線電俱樂部 BV3FG 新手教學 業餘無線電之操作方式 飛機無線電 臺北飛航情報區 - 掃描席(區管/近場) 桃園國際機場即時影像 flightaware eAIP 航空氣象服務網 國籍航空器型別及出廠製造日期(機齡)一覽 目視航圖雲端查詢系統 教你聽懂航空無線～ATC GO～民航機管制～你必須要知道的事 近況更新 已經考到業餘三等無線電執照，但是 UV-K5 刷了賣家的韌體居然鎖頻沒有鎖完全，這隻 UV-K5 UHF NCC 那邊的資料只能到 432MHz，但是賣家的韌體可以到 440MHz = =，所以沒辦法申請電台\u0026hellip; ","date":"2024-10-17T00:00:00Z","image":"https://www.d0ngy3.com:443/p/ham/title_hu_617fdd8de13fd014.JPG","permalink":"https://www.d0ngy3.com:443/p/ham/","title":"HAM"},{"content":"2024京都遊記 Date: 20240927~20241001 20240927 我們搭乘 BR132 班機，下飛機後轉乘 HARUKA 直達京都，之後到 sequence KYOTO GOJO check-in 東西放好之後就到附近因幡堂逛逛，一路走到錦市場，不過到的時候已經六點左右，店家已經關一半也沒什麼人，再繼續走到錦天満宮，晚餐就吃京都炎神的拉麵，這是我這次京都之旅最好吃的一餐!!吃完後就到 SOU・SOU 布袋、河原町OPA、3COINS、唐吉訶德逛逛買紀念品，之後就坐公車回飯店洗洗睡。\n20240928 第二天參加一日遊，主要的景點是美秀美術館，畢竟這次是室內設計公司的員工旅遊，怎麼可能少了建築參訪:)，雖然我大學就已經來去過，但是再訪美秀美術館還是覺得很美，這群人不意外的各種摸各種拍照，從入口到美術館門口走了半個小時:)，進去參觀的重點也是在看建築的細節，不過確實美術館比館藏還值得細品，之後買個麵包當午餐就前往下一站舊竹林寺，一個日式庭園，據說原本是老和尚安享晚年的所在，下一站白鬚神社，保佑健康長壽，特色是海上鳥居，不過我們剛好遇到在本殿在整修，最後就上車回京都車站，路上遇到塞車塞超久= =，到京都之後就是自由活動，我跟著一群人走到 AEON MALL，路上我越走越覺得熟悉，後來想一想大學那次就來過這裡買麵包零食，在 AEON MALL 逛了一陣子，花了 500 日圓夾了 OPANCHU USAGI 娃娃，再買了一些紀念品之後，覺得累趕緊回飯店休息。\n20240929 第三天和服 day，早上 8:10 check-out 後就坐計程車到第二間飯店 OMO5 京都祇園寄放行李，之後直衝和服店 9:00 開門女生就先進去，男生等到 9:30 才進去，進去才發現女生根本還沒開始換= =，反正最後 10:30 所有人換好出發去二年坂附近逛逛拍照，大家大概拍了一個小時就開始受不了，人又多穿和服束腹走路太不舒服了，所以就決定先坐計程車到午餐南禪寺逛逛，吃完午餐就回來還和服，南禪寺附近因為占地比較大所以比較空曠，感覺比較舒服也很好拍，午餐是吃南禪寺順正的豆腐鍋，不錯不過吃不出來為什麼這麼貴，可能是因為風景吧，吃完立馬坐計程車回去還衣服，題外話因為當時我 UBER 叫車的地點不能迴轉，司機繞了快一公里迴轉，當下超怕司機因為太麻煩棄單，還完和服後去 OMO5 check-in，之後就趕去先前預約的K36 (The Bar \u0026amp; Rooftop) 看夕陽，有一說一風景無敵，而且是在五星級酒店 ザ・ホテル青龍裡面，一進去感覺超像黑社會的高級招待所，超有質感隱身於傳統的京都街道中，等到落日後去吃晚餐，我找了一間 Uno Yukiko 拉麵店，我以為就是一間豆乳拉麵乍一看不錯，就一路走過去，到了門口發現四五個外國人在排隊，以為這麼多人排隊應該好吃吧，後來等了快一個小時才進去，點餐的時候發現這是無麩值拉麵覺得很酷，當拉麵上來我懷期待的吃了一口後發現，不好吃超鹹也沒有其他味道，重點是一碗日幣 1800 !!，後來勉強吃完後散步到鴨川吹吹風挺舒服的，BTW日本真的是行人天堂，然後幸運地看到藝妓!!她剛從計程車下來被一個男生牽著，之後去附近藥妝店有買了一波後回飯店休息。\n20240930 第四天睡到九點後，出發清水寺路上經過安井金比羅宮，一路沿清水坂走上去，大概 11:00 超爆多人，尤其是國人超多超大聲，反正就跟著人群一路到清水寺繞一圈，下來後到了 silver backs cafe 吃午餐，不錯吃而且沒什麼人，吃完之後就到伏見稻禾千本鳥居看看，人也很多而且鳥居路很小條，所以我們只看到千本鳥居就折返去ちいかわもぐもぐ本舗逛逛買買，買完之後就坐電車到三条河原，因為我想去 glänta 做戒指，不過排了快一個小時的隊伍才前進兩組客人，實在等太久所以放棄去吃晚餐，打開地圖發現附近有 Nijiya Vegan Izakaya 看起來不錯，我們走過去發現也有外國人在排隊，想說是不是很好吃所以很多人在排隊，等到我們擠進那個小店的最裡面的座位開始吃飯時，恩超鹹，我吃不出這到底為什麼這麼貴，也不知道為什麼這麼多人在排隊，最後買了一些東西回飯店看大廚表演，因為 OMO5 的房間是有廚房而且餐具鍋具一應具全，吃完宵夜就回房休息。\n20241001 第五天，早上 9:30 把行李交給飯店幫我們送到京都車站，之後就在附近八坂神社跟花見小路逛一下，很幸運地又看到藝妓，之後走到四条河原町把最後想買的買一買，然後路上又看到藝妓在出席活動，本次京都行一共看到三次藝妓好幸運，之後坐車到京都車站吃午餐，午餐吃京豆富 不二乃老實說不錯吃，而且周圍都是日本人沒有外國人，不過剛好位子看不到風景有點可惜，吃完午餐後就到京都車站地下街把伴手禮買一買準備搭 HARUKA 去機場，到機場到處逛逛後就登機 BR129 回台灣，到台灣剛好宣布放颱風假，有夠舒服連放兩天夭壽讚。\n京都下次想去 京都最強的御守 日本御朱印要怎麼求 旅遊紀錄~ ","date":"2024-10-01T00:00:00Z","image":"https://www.d0ngy3.com:443/p/2024kyoto/title_hu_fcd956a881060785.JPG","permalink":"https://www.d0ngy3.com:443/p/2024kyoto/","title":"2024京都"},{"content":"自動控制系統 Automatic Control Systems 筆記 Ch1 Introduction to Control Systems 控制系統基本組成 控制系統的基本要素可以透過以下方式描述: 控制目標 控制系統組件 結果或輸出 控制系統的目標是透過控制系統的元件，以某種規定的方式透過輸入來控制輸出，元件可以透過方塊圖表示。\n控制系統的應用範例 控制系統的一個例子，汽車引擎的怠速控制。這種控制系統的目標是無論施加的引擎負載（例如變速箱、動力轉向、空調）如何，都將引擎怠速保持在相對較低的值（為了燃油經濟性）。如果沒有怠速控制，任何突然的引擎負載應用都會導致引擎轉速下降，從而可能導致引擎熄火。因此，怠速控制系統的主要目標是\n消除或最小化引擎負載時的速度下降 將引擎怠速維持在期望值 節氣門開度 $\\alpha$ 和負載扭力 $T_{L}$（由於空調、動力轉向、變速箱或動力煞車等的應用）是輸入，引擎轉速 $\\omega$ 是輸出。\n控制系統的另一個例子，追日系統，控制器確保追蹤收集器在早晨指向太陽並發送“開始追蹤”命令。控制器在白天不斷計算兩個控制軸（方位角和仰角）的太陽速率。\n控制器使用日照率和太陽感測器資訊作為輸入來產生適當的馬達命令來轉動收集器。\nOpen-loop vs. Closed-loop Open-loop (Nonfeedback System) 開環系統簡單便宜，但通常不準確。前面提到的怠速控制系統就是開環控制系統，不難看出該系統性能較難滿足需求。例如，如果將節氣門角度 $\\alpha$ 設定為與特定引擎轉速相對應的特定初始值，則當施加負載扭力 $T_{L}$ 時，無法防止引擎轉速下降。使系統正常工作的唯一方法是根據負載扭矩的變化調整 $\\alpha$，以將 $\\omega$ 維持在所需水平。\nClose-loop (Feedback System) 為了更準確和更具適應性的控制，開環控制系統中缺少的是從系統的輸出到輸入的連結或回授。為了獲得更精確的控制，應回授受控訊號並與參考輸入進行比較，並且必須透過系統發送與輸入和輸出之差成比例的驅動訊號以校正誤差。具有一個或多個回授路徑（例如剛剛描述的）的系統稱為 Close-loop System。\n閉環怠速控制系統如圖所示。參考輸入 $\\omega_{r}$ 設定所需的怠速。怠速時的引擎速度應與參考值 $\\omega_{r}$ 一致，並且諸如負載扭矩 $T_{L}$ 之類的任何差異由速度感測器和誤差檢測器感測。控制器將對差異進行操作並提供訊號來調整節氣門角度 $\\alpha$ 以校正誤差。\n下圖比較開環和閉環怠速控制系統的典型性能。左圖為開環系統，在施加負載扭力 $T_{L}$ 後，開環系統的怠速將下降並穩定在較低值。右圖為閉環系統，施加負載扭力 $T_{L}$ 後，閉環系統的怠速迅速恢復到預設值。\nFeedback 閉環系統的回授用於減少參考輸入和系統輸出之間的誤差。然而，控制系統中回授影響的重要性比這些簡單例子所證明的更為複雜。系統誤差的減少只是回授可能對系統產生的許多重要影響之一。我們將在以下部分中展示回授也會對 stability, bandwidth, overallgain, impedance, and sensitivity 等系統效能特性產生影響。\nStability 我們可以透過簡單的靜態系統符號來討論，無須線性系統理論的必要數學基礎。考慮下圖 所示的簡單回授系統配置，其中 $r$ 是輸入訊號、 $y$ 是輸出訊號、 $e$ 是誤差、 $b$ 是回授訊號。參數 $G$ 和 $H$ 可以被認為是恆定增益。\n透過簡單的代數運算，可以簡單證明系統的輸入輸出關係為: $$\\large M = {\\frac {y}{r}} = {\\frac {G}{1 + GH}} $$\n根據上述方程式，回授會以 $1 + GH$ 這個因子影響無回授系統的增益 $G$。上圖的回授系統被稱為負回授系統，因為回授訊號上有一個負號。 $GH$ 本身可能也包含負號，因此回授的總體效果可能是增加或減少增益 $G$。 在實際的控制系統中，$G$ 和 $H$ 是頻率的函數，因此 $1 + GH$ 的幅值在某些頻率範圍內可能大於1，而在其他範圍內可能小於1。因此，回授可能在某些頻率範圍內增加系統的增益，但在其他範圍內減少增益。 穩定性是一個描述系統是否能夠跟隨輸入指令的概念，換句話說，它反映了系統是否有用。在較不嚴格的定義中，如果系統的輸出失控，則被認為是不穩定的。為了探討回授對穩定性的影響，當上述方程式 $GH = -1$ 時，系統對任何有限的輸入都會產生無限的輸出，這時系統被稱為不穩定。因此，我們可以說，回授可能會使原本穩定的系統變得不穩定。 回授確實是一把雙刃劍，當使用不當時，它可能會帶來不利的影響。不過需要指出的是，我們目前只討論靜態情況，一般來說，$GH = -1$ 並不是不穩定的唯一條件。系統穩定性的相關內容會在後續討論。\n假設回授系統由於 $GH = -1$ 而不穩定。如果我們透過引入一個負回授增益 $F$ 來形成另一個回授迴路，如下圖所示。\n則整個系統的輸入-輸出關係為:\n$$ \\large {\\frac {y}{r}} = {\\frac {G}{1+GH+GF}} $$\n很明顯，儘管 $G$ 和 $H$ 的性質使得內部迴路回授系統由於 $GH = -1$ 而不穩定，但透過適當選擇外部迴路的回授增益 $F$，整體系統仍然可以穩定。在實際操作中，$GH$ 是頻率的函數，閉迴路系統的穩定性條件取決於 $GH$ 的幅值和相位。因此，回授如果應用得當，能夠改善穩定性；但如果應用不當，則可能對穩定性有害。 Sensitivity 在設計控制系統時，敏感性考量通常是重要的。由於所有物理元件的特性會隨著環境和時間的變化而改變，我們無法假設控制系統的參數在整個運行壽命中始終保持不變。 例如，電動機的繞組電阻會隨著運行過程中溫度的升高而改變。具有電子元件的控制系統在剛啟動時可能無法正常運作，因為系統參數在預熱過程中仍在變化。這種現象有時被稱為morning sickness。 一般來說，一個良好的控制系統應該對參數變化不敏感，但對輸入指令敏感。我們將探討回授對參數變化敏感性的影響。我們將 $G$ 視為一個可能變化的增益參數。整個系統增益 $M$ 對 $G$ 變化的敏感性定義為:\n$$\\large S_{M}^{G} = {\\frac {{\\partial{M}}/{G}}{{\\partial{G}}/{M}}} = {\\frac {percentage\\ change \\ in\\ M}{percentage\\ change \\ in\\ G}} = {\\frac {\\partial{M}}{\\partial{G}}}{\\frac{G}{M}}$$\n其中 $ \\partial M $ 表示由於 $G$（或 $ \\partial G $）導致的 $M$ 的增量變化，$ \\partial G $ 表示系統元件變化量。 Disturbance and Noise 所有物理系統在運作過程中都會受到某些類型的外部信號或噪音的影響，例如，電子電路中的熱噪音電壓和電動機中的刷子或換向器噪音就是這些信號的例子。此外，外部擾動，如風吹在天線上的影響，在控制系統中也非常常見。\n因此，控制系統應該被設計成對噪音和擾動不敏感，並對輸入命令敏感，而回授可以減少噪音的影響。\n回授對噪音和擾動的影響在很大程度上取決於這些外部信號在系統中的位置。雖然不能得出一般性的結論，但在許多情況下，回授可以減少噪音和擾動對系統性能的影響。以下圖為例。\n其中 $r$ 表示指令信號，$n$ 是噪音信號。在沒有回授的情況下，即 $H = 0$，由於僅有 $n$ 作為作用，輸出 $y$ 是： $$\\large y = G_{2}n$$ 在有回授的情況下，由於僅有 $n$ 作為作用，系統輸出 $y$ 是： $$\\large y = {\\frac {G_{2}}{1+G_{1}G_{2}H}}n$$\n比較有回授與無回授公式可以看出，如果 $1 + G_1G_2H$ 大於 1 且系統保持穩定，則噪音成分會被 $1 + G_1G_2H$ 這個因子所減少。 在後續章節中，前饋和前向控制器配置與回授一起使用，以減少擾動和噪音輸入的影響，一般而言，回授還會影響帶寬、阻抗、瞬態響應和頻率響應等性能特徵，這些影響會在後續內容中進一步解釋。 Type of control system 控制系統又可以根據其特性分類為: Single vs Multiple Inputs / Single vs Multiple Outputs SISO (single input - single output) SIMO MISO MIMO Feed-forward or Feedback Linear or Nonlinear Time-varying or Time-invariant Continuous-data or Discrete-data Modulated or Unmodulated 控制系統通常根據系統的主要用途進行分類。例如，位置控制系統和速度控制系統控制輸出變量，正如其名稱所暗示的那樣。一般來說，根據系統的一些特殊特徵，還有許多其他的識別控制系統的方法，在開始分析和設計這些系統之前，了解一些更常見的控制系統分類方法非常重要，另外大多數現實生活中的控制系統都具有一定程度的非線性特性。 Linear and Nonlinear 這種分類是根據分析和設計的方法來進行的。嚴格來說，線性系統在實踐中並不存在，因為所有物理系統在某種程度上都是非線性的，線性回授控制系統是分析者為了簡化分析和設計而理想化的模型。 當控制系統中的信號幅值限制在系統組件顯示線性特徵的範圍內（即，疊加原則適用）時，系統本質上是線性的。但是，當信號幅值超過線性操作的範圍時，根據非線性的嚴重程度，系統不再應被視為線性系統。 例如，控制系統中使用的放大器在其輸入信號變大時經常會顯示飽和效應；電動機的磁場通常具有飽和特性。控制系統中其他常見的非線性效應包括齒輪成員之間的回程或死區、非線性彈簧特性、移動成員之間的非線性摩擦力或扭矩等。通常，非線性特性會被故意引入控制系統中，以提高性能或提供更有效的控制。 例如，為了實現最小時間控制，許多導彈或航天器控制系統中使用了開關型（bang-bang 或繼電器）控制器。在這些系統中，噴嘴通常安裝在飛行器的側面，以提供姿態控制的反作用扭矩。這些噴嘴通常以全開或全關的方式進行控制，因此從給定噴嘴中在特定時間內施加固定量的空氣以控制太空飛行器的姿態。 對於廣泛的非線性系統，目前沒有通用的方法來求解。 Time-varying and Time-invariant 當控制系統的參數在系統運作過程中對時間是穩定的，這樣的系統稱為時間不變系統。實際上，大多數物理系統包含隨時間漂移或變化的元素。 例如，電動機的繞組電阻會在電動機啟動時隨著溫度上升而變化。另一個時間變化系統的例子是導彈控制系統，其中導彈的質量在飛行過程中隨著燃料的消耗而減少。 雖然時間變化的系統如果沒有非線性仍然是線性系統，但這類系統的分析和設計通常比線性時間不變系統要複雜得多。 Continuous-data and Discrete-data 連續系統 連續數據系統是指系統中各部分的信號都是時間變量 $t$ 的連續函數。 連續數據系統中的信號可以進一步分類為交流（ac）或直流（dc）。與電氣工程中交流和直流信號的一般定義不同，在控制系統術語中，交流和直流控制系統具有特殊的意義。 當提到交流控制系統時，通常是指系統中的信號是通過某種調製方案進行調製的。而直流控制系統則簡單地表示信號是未經調製的，但根據傳統定義，它們仍然是交流信號。 離散系統 離散數據控制系統與連續數據系統不同，因為系統中一個或多個點的信號以脈衝列或數字代碼的形式存在。\n通常，離散數據控制系統被細分為取樣數據系統和數字控制系統。取樣數據控制系統指的是一類更一般的離散數據系統，其中信號以脈衝數據的形式存在。數字控制系統則是指在系統中使用數字計算機或控制器，使得信號被數字編碼，如二進制編碼。\n數字控制系統通常對噪音的敏感度較低。\n一般而言，取樣數據系統僅在特定的時間瞬間間歇性地接收數據或信息。例如，在控制系統中，誤差信號可能僅以脈衝的形式提供，這樣控制系統在兩個連續脈衝之間的時間段內將無法獲取關於誤差信號的任何信息。嚴格來說，取樣數據系統也可以被分類為交流系統，因為系統的信號是脈衝調製的。\nCh2 Modeling of Dynamic Systems 控制系統分析與設計中最重要的任務之一是系統子組件以及最終整個系統的數學建模。這些系統的模型由微分方程來表示，這些方程可以是線性或非線性的。在本書中主要討論由常微分方程來建模的系統，大多數應用中的控制系統分析與設計使用的是線性（或線性化）的模型，\n另外非線性系統的處理相當複雜，因此控制系統工程師不僅需要確定如何準確地用數學描述一個系統，還更重要的是，在必要時，如何做出適當的假設和近似，使得該系統可以通過線性數學模型來合理表徵。\n在本章中，我們將更詳細地探討各種控制系統組件的建模。控制系統可能由多個組件組成，包括機械、熱能、流體、氣動和電氣系統。這些系統通常稱為動態系統，透過建模原理，如牛頓第二運動定律、克希荷夫定律或質量守恆，將這些動態系統的模型用微分方程表示。\n機械系統 Laplace tranceform $$ \\large F(s) = \\mathscr{L} { f(t)} = \\int_{0}^{\\infty} f(t) e^{-st} \\mathrm{d}t$$\n$ \\large f(t) $ 為時域函數(time-domain function) $ \\large F(s) $ 為S域函數(S-doamin function) $ \\large s = \\sigma + j \\omega $ 控制系統採用拉式轉換的主因為方便計算、設計簡單，透過拉式轉換將複雜的積分轉為線性計算。\n基本函數的拉式轉換表 時域 $f(t)$ S域 $F(s)$ 收斂區間 ${\\displaystyle \\delta (t)\\ }$ $\\displaystyle1$ 所有S ${\\displaystyle u(t)\\ }$ ${\\displaystyle {1 \\over s}}$ ${\\displaystyle \\Re (s)\u0026gt;0}$ ${\\displaystyle t\\cdot u(t)\\ }$ ${\\displaystyle {\\frac {1}{s^{2}}}}$ ${\\displaystyle \\Re (s)\u0026gt;0}$ ${\\displaystyle t^{n}\\cdot u(t)}$ ${\\displaystyle {n! \\over s^{n+1}}}$ ${\\displaystyle \\Re (s)\u0026gt;0{\\text{ for }}n\u0026gt;-1}$ ${\\displaystyle e^{-\\alpha t}\\cdot u(t)}$ ${\\displaystyle {1 \\over s+\\alpha }}$ ${\\displaystyle \\Re (s)\u0026gt;-\\alpha}$ ${\\displaystyle t\\cdot e^{-\\alpha t}\\cdot u(t)}$ ${\\displaystyle {\\frac {1}{(s+\\alpha )^{2}}}}$ ${\\displaystyle \\Re (s)\u0026gt;-\\alpha}$ ${\\displaystyle t^{n}e^{-\\alpha t}\\cdot u(t)}$ ${\\displaystyle {\\frac {n!}{(s+\\alpha )^{n+1}}}}$ ${\\displaystyle \\Re (s)\u0026gt;-\\alpha}$ ${\\displaystyle \\sin(\\omega t)\\cdot u(t)\\ }$ ${\\displaystyle {\\omega \\over s^{2}+\\omega ^{2}}}$ ${\\displaystyle \\Re (s)\u0026gt;0}$ ${\\displaystyle \\cos(\\omega t)\\cdot u(t)\\ }$ ${\\displaystyle {s \\over s^{2}+\\omega ^{2}}}$ ${\\displaystyle \\Re (s)\u0026gt;0}$ ${\\displaystyle e^{-\\alpha t}\\sin(\\omega t)\\cdot u(t)\\ }$ ${\\displaystyle {\\omega \\over (s+\\alpha )^{2}+\\omega ^{2}}}$ ${\\displaystyle \\Re (s)\u0026gt;\\alpha}$ ${\\displaystyle e^{-\\alpha t}\\cos(\\omega t)\\cdot u(t)\\ }$ ${\\displaystyle {s+\\alpha \\over (s+\\alpha )^{2}+\\omega ^{2}}}$ ${\\displaystyle \\Re (s)\u0026gt;-\\alpha}$ References automatic control systems 10/e 吳炳飛教授自動控制系統 16.06 Principles of Automatic Control 2.04A Systems and Controls 6.241J Dynamic Systems and Control MarkDown語法大全 常用 LaTeX 數學符號指令 ","date":"2024-08-12T00:00:00Z","image":"https://www.d0ngy3.com:443/p/control/title_hu_6203a83d72a7cbc1.jpg","permalink":"https://www.d0ngy3.com:443/p/control/","title":"自動控制系統 Automatic Control Systems"},{"content":"輝達1顆H100賣95萬，台積電賺多少~ 今年5月可說是颳起一陣老黃旋風，原本不怎麼表現的伺服器類股飆起來，只要跟AI有直接或間接關聯的族群，都有機會受到題材加持，但 NVIDIA 最核心的部分還是在運算的晶片 H100 還有未來的 B100，說到晶片當然就跟 TSMC 有關，我們知道晶片是經過曝光、蝕刻、擴散、打磨一系列製程，最後從 wafer 上切下來，那麼一片 wafer 能夠切幾顆 H100 呢？根據報導，每片晶圓有86顆H100晶片，這個數量是怎麼算出來的呢？\n8吋、12吋、18吋晶圓？ 晶圓（英語：Wafer）是半導體晶體圓形片的簡稱，其為圓柱狀半導體晶體的薄切片，用於積體電路製程中作為載體基片，按其直徑分為4英寸、8英寸、12英寸甚至18英寸等規格，晶圓越大，同一圓片上可生產的積體電路（integrated circuit, IC）就越多，面積利用而言可降低單位成本，但目前主流成熟製程為8英寸，先進製程為12英寸，18吋因為考慮到現有設備轉換的成本、設備商開發意願低等因素反而遲遲未普及。\n各個尺寸wafer\n拉晶過程與矽晶棒\n先進封裝 先進封裝（Advanced Packaging）是指在半導體製造中，採用先進的技術和方法將製成的晶片（或稱集成電路，IC）封裝起來，以提高其性能、效率和可靠性。這些技術相較於傳統的封裝技術，能提供更高的集成度、更好的散熱效果、更高的速度和更低的功耗。先進封裝包括多種不同的技術和方法，其中一些主要的有：\n系統級封裝（System-in-Package，SiP）：將多個不同功能的晶片和元件集成到一個封裝中，實現完整的系統功能。 三維封裝（3D Packaging）：利用垂直堆疊的方式，將多個晶片疊加在一起，通過垂直互連（如TSV，硅通孔）實現高密度連接。 晶片上封裝（Chip on Wafer，CoW）和晶圓上封裝（Wafer on Wafer，WoW）：這些技術允許在晶圓級別進行封裝處理，然後再將整個晶圓切割成單獨的晶片。 2.5D 封裝：這是一種過渡技術，介於傳統的2D封裝和3D封裝之間，通常使用中介層（interposer）將多個晶片連接起來。 封裝中繞線（Fan-Out Wafer-Level Packaging，FOWLP）：在晶圓級別進行封裝，並通過在封裝中增加再分配層（Redistribution Layer，RDL）來實現更多的I/O引腳和更高的性能。\nCoWoS CoWoS（Chip on Wafer on Substrate）是一種先進封裝技術，由台積電（TSMC）開發。這項技術允許將多個晶片（chip）安裝在一個矽晶圓（wafer）上，然後再將這個矽晶圓安裝到基板（substrate）上。這種方法可以實現更高的集成度和更高的性能，同時也有助於減少功耗和提高散熱效率。\nFOWLP FOWLP（Fan-Out Wafer-Level Packaging，扇出型晶圓級封裝）是一種先進封裝技術，用於提高半導體器件的集成度和性能，最大的特點在於，在尺寸相同的晶片下讓重分佈層範圍更廣，晶片腳數更多，單晶片可以整合更多功能，並達到無載板封裝、薄型化以及低成本等優點，與傳統的封裝技術相比，FOWLP具有許多優勢，包括更高的I/O密度、更好的電氣性能和更小的封裝尺寸。\n扇出型封裝有兩大技術分支：晶圓級扇出型 (Fan-out Wafer Level Packaging，FOWLP) 和面板級扇出型技術(Fan-out Panel Level Packaging, FOPLP)。\nFOPLP技術的雛形是嵌入基板式的封裝，將一些無源器件或功率器件嵌入在基板裡面進行RDL互連，形成一個小型化的解決方案。相比FOWLP，FOPLP的封裝尺寸更大，成本更低，很快就成為封裝領域的研發熱點。FOWLP擅長於CPU、GPU、FPGA等大型晶片，FOPLP則以APE、PMIC、功率器件等為主。\n以下是FOWLP的工作原理和主要特點：\n晶圓切割：首先，將已完成的晶圓切割成單個晶粒（Die）。 重新排列：將這些晶粒重新排列在一個載板上，並保持適當的間距，形成重新排列的晶圓（Reconstituted Wafer）。 模塑封裝：使用環氧模塑料將晶粒封裝在一起，形成一個整體。 再分配層（Redistribution Layer，RDL）：在封裝的頂部和底部添加再分配層，這些層允許在晶粒之間和封裝外部之間實現電連接。 引線焊球（Solder Ball）：在封裝的底部添加引線焊球，這些焊球將封裝連接到電路板或其他封裝。 HBM HBM（High Bandwidth Memory，高帶寬存儲器） 是一種先進的存儲技術，由三星電子和 SK Hynix 等公司開發。它旨在提供比傳統 DRAM（動態隨機存取記憶體）更高的帶寬和更低的功耗，主要應用於高性能計算（HPC）、圖形處理、數據中心和人工智能等領域。\nHBM的主要特點和優勢\n高帶寬：HBM 利用寬總線和多層堆疊的設計，提供比傳統 DRAM 高得多的帶寬。HBM1 的帶寬可達 128 GB/s，HBM2 的帶寬可達 256 GB/s，而最新的 HBM3 帶寬甚至更高。 低功耗：由於短的連接線和高效的數據傳輸機制，HBM 的功耗比傳統 DRAM 低得多，有助於減少整體系統的能耗。 高密度：HBM 利用 3D堆疊技術，將多層 DRAM 晶片垂直堆疊在一起，通過 TSV（Through-Silicon Via，矽通孔）實現連接，從而在有限的空間內提供更高的存儲密度。 小體積：相比於傳統的封裝方式，HBM 的體積更小，適合用於對空間要求較高的應用，例如圖形處理單元（GPU）和高性能計算系統。 目前HBM良率高低，主要與堆疊架構複雜度有關，牽涉到多重記憶體階層，以及各層連結用的直通矽晶穿孔（Through-Silicon Via，TSV）。這些複雜技術增加製程出現缺陷的機率，可能讓良率低於設計簡單的記憶體。此外，HBM 一旦有個晶片有缺陷，整個封裝都需丟棄，因此產量很低。消息顯示，HBM整體良率約 65%，若業者試圖拉高良率，產量就會下降。\nCPO？矽光子是什麼？ 矽光子（Silicon Photonics） 是一種技術，利用矽作為光學材料來設計和製造光學器件和系統。這項技術結合了光子學和微電子學的優勢，能夠實現高速數據傳輸和處理，廣泛應用於通訊、數據中心和傳感器等領域。\nCPO CPO 使用矽光子（Silicon Photonics，即透過矽作為光的傳輸媒介），將傳統光收發模組中的光通訊元件與交換器晶片整合、封裝在同一個封裝模組中（即光引擎），並安裝在同一個 Socket（插槽）上，減少了資料的傳輸路徑，在維持高傳輸速度下降低了功耗並減少訊號耗損或延遲。\n","date":"2024-07-07T00:00:00Z","image":"https://www.d0ngy3.com:443/p/semiconductor/tsmc_hu_72a687876f36916e.jpg","permalink":"https://www.d0ngy3.com:443/p/semiconductor/","title":"TSMC 護國神山？!"},{"content":"Ollama Docker 的概述 Ollama Docker 是一個專為企業設計的本地部署解決方案，利用 Docker 容器技術來實現 Ollama 的高效運行。通過 Docker，Ollama 可以在不同的環境中快速部署，確保應用的一致性和可移植性。這使得企業能夠在自己的基礎設施上運行 Ollama，保證數據的安全和私密性，同時享受先進的 AI 和 ML 技術帶來的好處。\nOllama Docker 的部署要求 部署 Ollama Docker 需要一些基本的硬件和軟件要求。首先，需要確保系統已安裝 Docker 引擎。建議的硬件配置包括至少 8 GB 的 RAM 和多核處理器，以保證容器內的 AI 模型能夠高效運行。此外，還需要穩定的網絡連接以便下載必要的 Docker 映像文件和依賴包。對於操作系統，Ollama Docker 支持主流的 Linux 發行版，例如 Ubuntu、CentOS 和 Debian。\nOllama Docker 的部署步驟 安裝 Docker：如果尚未安裝 Docker，可以通過官方文檔進行安裝。 獲取 Ollama Docker 映像：使用 Docker Hub 或私有 Docker 映像庫來拉取 Ollama 的映像。例如：docker pull ollama/ollama:latest。 配置環境變量：根據需要設置環境變量，這些變量可能包括數據庫連接、API 密鑰等。 運行容器：使用 Docker 命令運行 Ollama 容器，例如：docker run -d -p 8080:80 \u0026ndash;name ollama-container ollama/ollama。 驗證部署：確保容器運行正常，可以通過訪問指定的端口來驗證 Ollama 的服務是否已啟動。\nOllama Docker 的管理和維護 為了保持 Ollama Docker 的高效運行，定期的管理和維護是必不可少的。這包括監控容器的資源使用情況，更新 Docker 映像以獲取最新的功能和修復，以及備份和恢復數據。利用 Docker 的內置工具，可以方便地管理多個容器的生命周期，例如使用 docker ps 查看運行中的容器，使用 docker stop 和 docker start 來控制容器的運行。此外，還可以結合 Docker Compose 來管理多容器應用，使得 Ollama 的部署更加靈活和高效。\ndocker 部屬 cloudflare tunnel 穿透內網直接訪問伺服器，open-webui 透過網頁直接使用，ollama運行llm\ndocker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 services: cloudflare: image: cloudflare/cloudflared container_name: cloudflared_tunnel_container command: tunnel --no-autoupdate run --token \u0026#39;cloudflare token\u0026#39; restart: unless-stopped networks: - ollama-docker ollama: image: ollama/ollama:latest ports: - 11434:11434 volumes: - .:/code - ./ollama:/root/.ollama container_name: ollama pull_policy: always tty: true restart: always networks: - ollama-docker open-webui: image: ghcr.io/open-webui/open-webui:main container_name: open-webui volumes: - ./open-webui:/app/backend/data depends_on: - ollama ports: - 8080:8080 environment: - \u0026#39;/ollama/api=http://ollama:11434/api\u0026#39; extra_hosts: - host.docker.internal:host-gateway restart: unless-stopped networks: - ollama-docker chromadb: image: chromadb/chroma ports: - \u0026#34;8000:8000\u0026#34; restart: always volumes: - chromadb_volume:/chroma/chroma networks: ollama-docker: external: false ","date":"2024-07-02T00:00:00Z","image":"https://www.d0ngy3.com:443/p/llm/hudai-gayiran-3Od_VKcDEAA-unsplash_hu_2dcc690417a3a301.jpg","permalink":"https://www.d0ngy3.com:443/p/llm/","title":"Local LLM"},{"content":"緣起 看到網路上有許多人從 Hexo 搬移至 Hugo，看起來比較多人在用因此選擇 Hugo 作為框架，不過對我來說只要能支援 Markdown 並且無長度上的限制就好了。\n注意事項 我使用 Docker 來建立，並選擇 Stack 主題，要注意的是 Docker img 要選擇 hugo extended 不然有些主題(如Stack)回無法運行，如果是選擇直接安裝也建議使用 extended 版本。\n安裝步驟 以下操作是搭配git做版本控管，並將 Stack 主題作為 git submodule\n初始化，在終端機輸入以下指另建立一個blog的資料夾作為網站根目錄，並初始化 git\n1 2 3 hugo new site blog cd blog git init 接著將 Stack 主題下載到themes中\n1 git submodule add git://github.com/CaiJimmy/hugo-theme-stack/ themes/hugo-theme-stack 將 exampleSite 中的 content 複製到 content\n1 2 3 4 5 6 7 8 9 10 11 12 13 ├─content #貼上到這裡 │ ├─page │ │ about.md │ │ archives.md │ │ search.md └─themes └─hugo-theme-stack ├─exampleSite │ └─content #複製這裡 │ ├─page #複製 │ │ about.md │ │ archives.md │ │ search.md 將 exampleSite 中的 hugo.yaml 複製到 blog 根目錄中，並刪除預設的 config.toml\n到此 Hugo 與 Stack 主題基本的配置完了\u0026hellip;吧？！\n調整字體 在themes\\hugo-theme-stack\\assets\\scss\\custom.scss加入下方code就可以將字體改為思源黑體\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /*-----------字體----------*/ @import url(\u0026#39;https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100..900\u0026amp;family=Noto+Serif+SC:wght@200..900\u0026amp;display=swap\u0026#39;); // 文章字體 body, .article-content { font-family: \u0026#34;Noto Sans TC\u0026#34;, sans-serif; } // 標題字體 body, .article-title { font-family: \u0026#34;Noto Sans TC\u0026#34;, sans-serif; } // 首頁字體 body, .article-page { font-family: \u0026#34;Noto Sans TC\u0026#34;, sans-serif; ","date":"2024-06-02T00:00:00Z","image":"https://www.d0ngy3.com:443/p/hugo-debug/helena-hertz-wWZzXlDpMog-unsplash_hu_2307260c751d0e0b.jpg","permalink":"https://www.d0ngy3.com:443/p/hugo-debug/","title":"Hugo"},{"content":"TPM2.0 TPM（Trusted Platform Module）是一種硬體安全晶片，其主要功能是提供安全的密碼和金鑰管理，並支持硬體層面的安全功能，以確保計算機系統的安全性。TPM 主要用於提供硬體級的安全功能，例如保護密碼、存儲敏感數據、驗證系統的完整性等。 TPM（Trusted Platform Module）在計算機安全方面扮演關鍵角色，主要有以下功能。\n安全啟動過程通過確保系統的軟體和硬體完整性提供防範惡意攻擊的保護。 生成並安全存儲加密密鑰，用於保護敏感信息和確保通信安全。 基於硬體的加密功能提高性能並增強數據安全性。 支持遠程認證，確保遠程設備的配置完整性，加強設備間的安全通信和相互信任。 最常見的 TPM 功能是用於系統完整性測量及金鑰的建立與使用。 在系統開機程序期間，可以測量載入的開機程式碼 (包括韌體和作業系統元件) 並記錄在 TPM 中。 完整性測量可用來證明系統的啟動情況，以及確保只有在使用正確軟體來進行系統開機的情況下，才會使用 TPM 型金鑰。\nTPM 可以分為三種類型\ndTPM（discrete TPM），即完全獨立於電腦之外的 TPM 計算模組，理論而言最為安全； fTPM（firmware TPM），又稱為韌體 TPM，通常內建於中央處理器之內，透過模擬方式實現 TPM 相關安全功能；而處理器內部的TPM，比如Intel 的平臺信任科技(PTT) 和 AMD 的 fTPM，則把金鑰存儲在主機板上的 SPI 閃存中。 整合式 TPM，將 TPM 晶片與其他電腦零組件進行整合，不過邏輯運算上分開。 AMD Ryzen 系統配置可能會間歇性地在位於主機板上的 SPI 閃存記憶體（SPIROM）中執行擴展 fTPM 相關記憶體事務，這可能導致系統交互或響應暫時暫停，直到事務完成為止。\nTCG 在 TPM1.2 的設計中第一次嘗試解決以下產業界常見的問題:\n設備身份：在 TPM 發布之前，設備通常以 MAC 位址和 IP 位址作為自己的身份，這並不安全。 金鑰的安全產生：具備一個硬體隨機數產生器對金鑰的產生是非常有利的。 許多安全解決方案因為密鑰產生的品質不高而被破解。 金鑰的安全儲存：TPM 能夠安全儲存高品質的金鑰並讓它們免於軟體攻擊，這是TPM帶給設備的重大安全優勢。 NVRAM 儲存：當 IT 組織收到一個全新裝置時，它們常常會根據自己的標準流程格式化硬碟並重新部署軟體。 NVRAM 可以讓 TPM 一直保存憑證而不依賴外部儲存。 設備健康認證：在 TPM 出現之前，IT通常使用軟體來偵測系統的健康（安全）狀態。 但是，當整個軟體系統被攻破的情況下，軟體的報告就不可信賴了。 TPM2.0 在 1.2 版本的基礎上又增加了更多:\n演算法彈性：因為有些演算法的強度其實比預期弱，所以未來可能需要修改。 TPM2.0 可以在不用修改規範前提下修改演算法，這一點已經多次提到了。 增強的授權模式：這個功能透過增加授權策略的方式統一了 TPM 實體的授權方式。 授權策略可以支援多元素多使用者認證。 除此之外，還包括策略管理的功能。 快速密鑰載入：密鑰載入是一個很耗時的過程，因為密鑰常常被加密儲存。 新的TPM規範使用對稱金鑰來加密金鑰，相對於先前的非對稱金鑰加密，速度大大提高。 更穩定的PCR：過去，將密鑰和設備狀態綁定（狀態常常由PCR存儲，這裡綁定可以簡單理解為只有當某個PCR的值是某一個已知的好的狀態時，才允許訪問 密鑰）在一起會造成一些管理上的問題。 因為通常情況下，假設一個金鑰和儲存平 啟動過程測量值的 PCR 綁定，當啟動韌體因為正常更新影響 PCR 的值時，相應的金鑰就要修改或重新綁定。 這個問題在新版的 TPM 已經不是問題了。 靈活的管理功能：各種各樣的授權被分門別類，滿足了對 TPM 資源進行靈活管理的需求。 透過名稱識別資源：TPM1.2 中對資源的間接存取產生了安全隱患。 這問題在新的規範中透過使用資源名稱來解決，名稱本身經過基於密碼學的安全處理。 9.1 Trust 在可信賴計算組 (TCG) 規範的脈絡中，「信任」旨在傳達對行為的期望，如果一個系統運算總是按照預期的方式和目標進行，那它就是可信的。然而可預測的行為不一定構成值得信任的行為。例如，我們期望銀行會表現得像銀行，我們期望小偷會表現得像小偷。 TCG 定義了在平台中建立信任的方案，該方案基於識別其硬體和軟體元件，可信任平台模組 (TPM) 提供了收集和報告這些身分的方法，電腦系統中使用的 TPM 以允許確定預期行為並根據該預期建立信任的方式報告硬體和軟體。 11.3 I/O Buffer I/O Buffer 是 TPM 和主機系統之間的通訊區域，系統將命令資料放入I/O Buffer並從 Buffer 中檢索回應數據。 用於將 I/O Buffer 資料移入/移出系統的物理過程的描述超出了本規範的範圍，TCG 內的特定於平台的工作小組為其平台上的 TPM 實體介面製定規格，這些規格詳細說明了系統軟體和 TPM I/O Buffer之間的交互。 不要求 I/O Buffer 與系統的其他部分物理隔離，它可以是共享記憶體，但是當開始處理命令時，實作必須確保 TPM 使用正確的值。例如，如果 TPM 執行命令資料的 hsah 作為授權處理的一部分，則 TPM 需要保護已驗證的命令資料免於修改。也就是說，在資料被驗證前保護其不被修改。在修改資料之前將其置於 Shielded Location。 11.4 Cryptography Subsystem Cryptography Subsystem 實現 TPM 的加密功能。它可以由 Command Parsing module、Authorization Subsystem 或 Command Execution module呼叫。 TPM 以常規方式採用常規加密操作。這些操作包括:\nhash function asymmetric encryption, decryption, signing and signature verification symmetric encryption, decryption, signing (HMAC and SMAC) and signature verification key generation Hash Hash（哈希或散列）算法，又常被稱為指紋（fingerprint）或摘要（digest）算法，是非常基礎也非常重要的一類算法。可以將任意長度的二進制明文串映射為較短的（通常是固定長度的）二進制串（Hash 值），並且不同的明文很難映射為相同的 Hash 值。\n一個好的哈希算法具有以下特點: 正向快速：給定原文和 Hash 算法，在有限時間和有限資源內能計算得到 Hash 值； 逆向困難：給定（若干）Hash 值，在有限時間內無法（基本不可能）逆推出原文； 輸入敏感：原始輸入信息發生任何改變，新產生的 Hash 值都應該發生很大變化； 碰撞避免：很難找到兩段內容不同的明文，使得它們的 Hash 值一致（即發生碰撞）。 用途: 對傳輸數據進行摘要(fingerprint)並與數據一同發出，接收端接收後對數據 Hash 與給定的 Hash 比較就能確定資料是否正確。 Asymmetric cryptography 顧名思義，非對稱加密中，加密密鑰和解密密鑰是不同的，分別被稱為公鑰（Public Key）和私鑰（Private Key）。私鑰一般通過隨機數算法生成，公鑰可以根據私鑰生成。 其中，公鑰一般是公開的，他人可獲取的；私鑰則是個人持有並且要嚴密保護，不能被他人獲取。\nRSA: 算法利用了對大數進行質因子分解困難的特性，但目前還沒有數學證明兩者難度等價，或許存在未知算法可以繞過大數分解而進行解密。 ECC: Elliptic Curve Cryptography，應用最廣也是強度最早的系列算法，基於對橢圓曲線上特定點進行特殊乘法逆運算（求離散對數）難以計算的特性。 Symmetric cryptography 對稱加密算法，顧名思義，加密和解密過程的密鑰是相同的。該類算法優點是加解密效率（速度快，空間佔用小）和加密強度都很高。\nAES: 標準為 FIPS-197。AES 也是分組算法，分組長度為 128、192、256 位三種。AES 的優勢在於處理速度快，整個過程可以數學化描述，目前尚未有有效的破解手段。 DES: 採用 FIPS-46-3，將 64 位明文加密為 64 位的密文。其密鑰長度為 64 位（包括 8 位校驗碼），現在已經很容易被暴力破解。 stream ciphe(RC4)，block cipher(DES, AES) Block Cipher Modes 分組加密（英語：Block cipher），又稱分塊加密或塊密碼，是一種對稱金鑰演算法。 它將明文分成多個等長的模組（block），使用確定的演算法和對稱金鑰對每組分別加密解密，對於如何切分、加密對應不同的工作模式，針對 AES 共有 5 種模式。\nBlock Cipher Modes\nMode Name - ECB Electronic Code Book Mode 將明文按分組大小切分，然後用同樣的金鑰正常加密切分好的明文分組。 CBC Cipher Block Chaining Mode 每個明文塊先與前一個密文塊進行互斥或後，再進行加密。為了保證每條訊息的唯一性，在第一個塊中需要使用初始化向量IV。 CFB Cipher Feedback Mode 與CBC模式類似，但不同的地方在於，CFB模式先生成密碼流字典，然後用密碼字典與明文進行異或操作並最終生成密文。 OFB Output Feedback Mode OFB模式與CFB模式不同的地方是：生成字典的時候會採用明文參與運算，CFB採用的是密文。 CTR Counter Mode CTR模式同樣會產生流密碼字典，但同是會引入一個計數，以保證任意長時間均不會產生重複輸出。 Cipher Feedback (CFB) Mode 當選擇對稱分組密碼作為與會話關聯的加密演算法時，將使用 CFB。 當用於參數加密時，金鑰和 Initialization Vector (IV) 是從每個會話金鑰派生的，因此從統計角度來看，重複使用相同的金鑰和 IV 是不太可能的。當物件未儲存在屏蔽位置時，CFB 也用於物件敏感區域的對稱加密。 以這種方式使用時，密鑰和 IV 源自於 secret。 在某些情況下，IV 設定為零。\nXOR Obfuscation XOR混淆類似於計數器模式（CTR）塊加密，但它使用一個密鑰派生函數（KDF）作為偽隨機函數，而不是對稱塊加密。XOR混淆將調用方與TPM共享的算法數量減少到一個（哈希），以便以某種程度的保密性和身份驗證使用TPM。該規範中的XOR方案與TPM 1.2中使用的方案不同：它使用不同的公式將輸入輸入到哈希函數中。 TPM2.0 所指的 XOR obfuscation 如下所示:\n$$ XOR(data, hashAlg, key, contextU, contextV) $$\ndata: 包含要混淆的資料的可變大小的緩衝區 hashAlg: KDF 中使用的雜湊演算法 key: 包含金鑰的可變大小的值 contextU: 一個可變大小的值，用於限定操作的一方（通常是隨機數值） contextV: 一個可變大小的值，用於限定操作的一方（通常是隨機數值） XOR() function 會使用 KDFa() 產生 mask，定義如下:\n$$ mask ≔ KDFa (hashAlg, key, “XOR”, contextU, contextV, data.size • 8) $$\n然後將 mask 的 8 Bytes 與 data.buffer 的 8 Bytes 進行 XOR。 Extend 「擴展」操作用於對摘要值進行增量更新。它對於更新PCR、auditing 和構建 policy 非常有用，也用於擴展具 TPMA_NV_EXTEND屬性的 NV Index。擴展操作使用 hash 將新數據與現有摘要結合。其表示法為：\n$$ digest_{new} ≔ H_{hashAlg} (digest_{old} \\ || \\ data_{new}) $$\n$digest_{new}$: Extend 操作後的摘要值 (例如 PCR) $H_{hashAlg}$: Hash 函數（例如與特定 PCR bank 相關的雜湊演算法） $digest_{old}$: Extend 操作前的摘要值 $data_{new}$: 可變數量的資料八位元組，與 $digest_{old}$ Hash 產生 Extend 結果 AES也是一種密碼強度很高的對稱密碼演算法，但是如果需要商用的話要向NIST支付授權費用?\nKey Generation 密鑰產生產生兩種不同類型的密鑰，\n第一種是 ordinary key 普通密鑰，由 random number generator (RNG) 直接產生亂數 seed 進行計算，計算後產生的密鑰保存在本地的屏蔽區域。 第二種為 Primary Key 主鍵，由 seed 進行計算產生，TPM 將持久性儲存由 RNG 產生的 seed，並使用 key derivation function (KDF) 派生密鑰，SP800-108 的 KDF 廣泛用於本規範。除了由 RNG 產生也可以由其他 secret value 作為 seed 主鍵\nKey Derivation Function TPM 使用基於雜湊的函數來產生用於多種目的的金鑰。此規範使用兩種不同的方案：一種用於 ECDH，另一種用於 KDF 的所有其他用途。ECDH KDF 來自 SP800-56A。計數器模式 KDF 來自 SP800-108 使用 HMAC 作為偽隨機函數 pseudo-random function (PRF)。它在規範中被稱為 $KDFa()$。另外有些演算法具有已知的弱密鑰。如果產生了這樣的金鑰，則必須將其丟棄，並透過 KDF 的另一次迭代重新開始產生新密鑰。\n$KDFa()$ 用於除 ECDH 之外，所有需要 KDF 的情況。 $KDFa()$ 使用 SP800-108 的計數器模式，以 HMAC 作為 PRF，根據 SP800-108，規範要求使用此 KDF，它使用對 KDFa() 的函數引用。\n用於建構 $KDFa()$ key stream 的 inner loop 定義如下: $$ K(i) ≔ HMAC (K_I , \\ [i]_2 \\ || \\ Label \\ || \\ 00 _{16} \\ || \\ Context \\ || \\ [L]_2) $$\n$K(i)$: KDF 內循環的第 $i^{th}$ 迭代 $HMAC()$: HMAC 演算法 $K_I$: the secret key $[i]_2$: 從 1 開始迭代的 32-bit counter $Label$: 一個八位元組流，指示此 KDF 產生的金鑰的使用 $00 _{16}$: 當$Label$不存在或$Label$的最後一個八位元組不為零時添加 $Context$: 與派生金鑰材料相關的資訊的二進位字串 $[L]_2$: 32-bit值，指示要從 KDF 傳回的位數 $KDFa()$ 函數原型為: $$ KDFa (hashAlg, \\ key, \\ label, \\ contextU, \\ contextV, \\ bits) $$\n$hashAlg$: KDF 中 HMAC 中使用的 TPM_ALG_ID $key$: 用作 $K_I$ 的可變大小值 $label$: 用作 $Label$ 的可變大小值 $contextU$: 與 contextV 連接用作 $Context$ 的可變大小值 $contextV$: 與 contextU 連接用作 $Context$ 的可變大小值 $bits$: 用作 $[L]_2$ 的 32-bit值 $contextU$ 和 $contextV$ 的值會作為大小緩衝區傳遞，並且僅使用緩衝區資料來組成 $Context$。 $$ Context ≔ contextU.buffer || contextV.buffer $$\n$KDFe$ 用於 ECDH，根據 SP800-56A 為受 ECC 保護的物件產生對稱加密金鑰，使用的 KDF 是“Concatenation Key Derivation Function”，\ninner loop 定義如下: $$ digest_{i} ≔ H(counter \\ || \\ Z \\ || \\ OtherInfo) $$\n$digest_{i}$ $H()$ $counter$ $Z$ $OtherInfo$ 本規範要求 $OtherInfo$ 為： $$ OtherInfo ≔ Use \\ || \\ PartyUInfo.buffer \\ || \\ PartyVInfo.buffer $$\n$Use$ $PartyUInfo.buffer$ $PartyVInfo.buffer$ $KDFe()$ 函數原型為： $$ KDFe(hashAlg, \\ Z, \\ Use, \\ PartyUInfo, \\ PartyVInfo, \\ bits) $$\n$hashAlg$ $Z$ $Use$ $PartyUInfo$ $PartyVInfo$ $bits$ HMAC HMAC(Hash Message Authentication Code)，通過特別計算方式之後產生的訊息鑑別碼（MAC），使用密碼雜湊函數，同時結合一個加密金鑰。它可以用來保證資料的完整性，同時可以用來作某個訊息的身分驗證，另外 HMAC 也用於產生密鑰。\nHMAC 有時被稱為對稱簽章，因為它們的運作方式類似於數位簽章，但使用單一金鑰進行簽署和驗證。\n$$ HMAC(Key, \\ Text) = Hash((Key \\oplus OPad) \\ || \\ Hash((Key \\oplus IPad) \\ || \\ Text)) $$\n$\\oplus$: XOR\nKey(金鑰)、test(文本)、Hash(SHA家族的任何一個Hash) opad跟ipad(填充) opad ：0x5c5c5c…5c5c。 ipad ：0x363636…3636。 SMAC (Symmetric Block Cipher Message Authentication Code)，SMAC 是使用對稱加密算法對某些資料進行對稱簽章的一種形式。它保證受保護的資料未被修改，密鑰值必須是 secret 或 share secret。 Signature TPM 可以使用非對稱或對稱演算法進行簽署。簽章方法取決於金鑰的類型。對於非對稱演算法，簽章方法取決於演算法（RSA 或 ECC）。對於對稱簽章，定義了 HMAC 和 SMAC 簽章。 TPM 只對經 TPM 運算的消息進行簽署，任何 TPM 產生的資料都有標頭 \u0026lsquo;TPM_GENERATED_VALUE\u0026rsquo;，當 TPM 進行簽署時會去確認 \u0026lsquo;TPM_GENERATED_VALUE\u0026rsquo; 。\nTPM 使用TPM2_VerifySignature()對簽章進行認證 經由 HMAC 簽署的稱為 \u0026lsquo;Tickets\u0026rsquo; Tickets Tickets 主要有兩個目的 re-signing data: 在TPM檢查非對稱簽名後，使用TPM對稱密鑰重新對摘要進行簽名，TPM可以在不載入非對稱密鑰的情況下重新驗證簽名。 expanding state memory: 當對外部消息進行哈希時，TPM具有一些狀態表明消息不是以 TPM_GENERATED_VALUE開頭的。Tickets 允許將這個狀態存儲在 TPM 之外的某個地方，當稍後將摘要提供給 TPM 進行簽名時，提供 Tickets，使 TPM 能夠驗證待簽名的摘要是安全的。 用於 Tickets 的證明值，至少應具有與哈希算法產生的摘要大小相等的位數。(EXAMPLE: A proof value of 256 bits is required for a SHA256 ticket.) Tickets 有五種 TPMT_TK_CREATION: 由TPM2_Create() 或TPM2_CreatePrimary()時生成，在 TPM2_CertifyCreation() 中使用，以便 TPM 能夠證明它創建了一個特定對象以及在創建對象時存在的環境參數（PCR）。這樣可以避免將創建數據的摘要作為對象數據結構的永久部分。 TPMT_TK_VERIFIED: 由TPM2_VerifySignature()生成，並被TPM2_PolicyAuthorize()使用。如果簽名是由非對稱密鑰簽署的，那麼簽名驗證可能需要花費時間。如果同一授權將被多次使用（例如用於TPM2_PolicyAuthorize()的授權），那麼將非對稱授權轉換為使用對稱加密的方式可能會有性能上的優勢，因為對稱密加密通常更快。此 Tickets 是對稱等效授權。 TPMT_TK_AUTH: 由TPM2_PolicySigned()或TPM2_PolicySecret()生成，並在TPM2_PolicyTicket()中使用。策略授權可以與特定的策略會話關聯，或者允許在任何策略中使用。當它可以在任何策略中使用時，它會有一個到期時間（可以是未來的任意時間）。長期有效的授權可能在TPM2_PolicySigned()/TPM2_PolicySecret()中給出，並生成一個 Tickets ，用於驗證授權參數（已授權內容）和未來到期的授權時間。然後，此票證由TPM2_PolicyTicket()處理，在 Tickets 到期之前，將對策略摘要計算具有與原始授權相同的效果。 TPMT_TK_HASHCHECK: 用於指示外部數據的摘要是否安全可簽名使用受限制的簽名密鑰。受限制的簽名密鑰只能對由 TPM 生成的摘要進行簽名。如果摘要是從外部提供的數據生成的，則需要有一個指示，表明該數據的開頭並不與在TPM內部生成的數據使用的第一個八位組相同。這可以防止對存證數據的“偽造”。此票證用於提供證據，表明TPM檢查了摘要中使用的數據並且可以安全地進行簽名。假設外部數據是“安全的”，則此類票證由TPM2_Hash()或TPM2_SequenceComplete()生成並由TPM2_Sign()使用。 NULL Ticket: 當回應具有一個 Ticket，但未生成任何 Ticket 時，將生成一個 NULL Ticket。例如使用 TPM2_PolicySecret() 指定過期時間為零，這不會生成 Ticket，因為過期時間為零，授權將立即過期，在這種情況下 TPM 將返回一個 NULL Ticket。當命令需要一個 Ticket，但沒有可用的 Ticket 數據時，也可以將 NULL Ticket 用作輸入參數。 Random Number Generator (RNG) Module RNG 是 TPM 中的亂數產生器。 TPM 在金鑰產生中使用隨機值作為隨機數，並在簽章中使用隨機值 RNG Module 通常包含以下內容\nAn entropy source and collector State Register A mixing function(通常是hash function) TPM 中的 entropy source 是 entropy collector。顧名思義，熵收集器從熵源收集熵並消除偏差。這些來源可能包括噪音、時鐘變化、空氣流動等事件。 mixing function 可以用偽隨機數產生器(PRNG)來實現。 PRNG 可能會從非隨機輸入（例如計數器）中產生明顯隨機的數字。 TPM 應為內部功能的每次使用提供足夠的隨機性，每次呼叫時應提供 32 Octet 的隨機性。\nAlgorithms 本規範中的 structures 和 commands 是在最小程度地依賴演算法預設值的情況下建構的。在大多數情況下，演算法標識符標識一系列演算法，後面跟著限定符。本規範僅使用雜湊演算法演算法識別碼，因為雜湊演算法標識符意味著摘要大小，如TPM_ALG_SHA256、TPM_ALG_SHA384。對稱和非對稱加密的演算法標識符標識家族，例如RSA、ECC、AES等。對於這些演算法，需要補充資訊來定義參數如 TPM_ALG_RSA、TPM_ALG_AES。 本規範不要求實現任何特定的演算法集。如果沒有一套至少包括一種雜湊演算法、一種具有批准參數的對稱加密演算法以及一種具有批准參數的非對稱加密/簽名演算法，TPM 將無法支援所有必要的功能。TPM 只能實作具有 TCG 分配的演算法 ID 的演算法。 Random Access Memory 數據在斷電會消失，但不保證一定消失。\nPCR TPM 就可以用來保存系統啟動過程中系統狀態測量值，PCR 就用來實現這個功能，PCR 中儲存了由軟體計算的一系列 Hash 值，TPM 可以透過使用一個特定的私鑰來簽署這些測量值，然後向外部報告。PCR 有一個單向儲存的特性可以保證內容不被篡改（HashExtend）。 因此，如果PCR中的值與預期的可信值相同，那麼這些值就被認為是可信的。 PCR 可以用於認證，創建的同時讓它們的授權配置與PCR某一個值綁定，只有PCR的值是某一個預期的狀態時才可以使用它們，例如:\nVPN只有在確認PC已經運行了所有IT允許的軟體後才授權設備存取網絡，如果是不被允許的軟體，PCR值會不同，認證會失敗。 檔案系統服務只有在確認MBR正常以及硬碟確實存在時才會得到解密金鑰。 Non-Volatile (NV) Memory TPM 中的 NVRAM 可以配置為單獨控制讀取和寫入功能，這意味著可以向用戶提供某些數據，而不必擔心這些數據會被意外或惡意刪除。具訪問控制的 NVRAM 有許多好處，它可以儲存在機器關閉時不可用的金鑰；比使用公鑰/私鑰對解密更快地存取數據，並提系統不同部分之間傳遞訊息的機制。系統在啟動初期沒辦法存取硬碟，這時 NVRAM 就可以用來儲存這個時候必須要使用的金鑰。 一個明顯的例子是，系統在啟動時在存取自加密硬碟之前必須輸入才密碼能讀寫。\n具備NVRAM能夠提供以下功能：\n儲存憑證鏈的根密鑰: 一般是每個人都可以存取的 public keys，但是必須保證 public keys 不能被修改。 儲存背書金鑰(endorsement key): 背書金鑰 EK 用於 TPM 在出廠設定階段解密憑證和傳遞密碼。 儲存機器已知的好的狀態(一些列的系統測量(HASH extend))值: UEFI 的安全啟動技術所使用的根公鑰類似，這些值用於系統擁有者控制系統在啟動虛擬機器（或 OS ）之前應該處於什麼樣的狀態。INTEL CPU有一個 Trusted Execution Technology(TXT)，其中的啟動控制策略(LaunchControlPolicy) 就用到了 TPM NVRAM 的這個作用。 在 TXT 中，使用者對 NVRAM 的內容有絕對的控制權，而 UEFI 的安全啟動並非如此。 儲存硬碟可用之前的解密金鑰：剛剛前文也介紹了，自加密硬碟。 Authorization Subsystem Command Dispatch module 在命令開始和結束時，會呼叫 Authorization Subsystem。在執行命令之前，Authorization Subsystem 會檢查是否已提供使用每個屏蔽位置的適當授權。 某些命令無需授權即可存取屏蔽位置；存取某些位置可能需要單因素授權；存取其他屏蔽位置可能需要使用任意複雜的授權策略。 授權子系統所需的唯一加密函數是雜湊和 HMAC。如果實作 TPM2_PolicySigned()，則可能需要非對稱演算法。 Power Detection Module 此模組結合平台電源狀態來管理 TPM 電源狀態。TPM 僅支援 ON 和 OFF 電源狀態。任何需要重設 RTM 的系統電源轉換也會導致 TPM 重設 (_TPM_Init)，也會導致 RTM 重置。\nIn most cases, the RTM will be a host CPU.\nNote UEFI Code 根據 TCG PC Client Platform TPM Profile (PTP) 定義的 Register Space 與軟體 flow 實現的Code\nedk2/MdePkg/Include/IndustryStandard/TpmPtp.h 1 2 3 4 5 6 7 8 9 // // Define pointer types used to access TIS registers on PC // typedef PTP_FIFO_REGISTERS *PTP_FIFO_REGISTERS_PTR; // // Define pointer types used to access CRB registers on PTP // typedef PTP_CRB_REGISTERS *PTP_CRB_REGISTERS_PTR; edk2/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c 1 2 3 4 5 6 7 PtpCrbTpmCommand ( IN PTP_CRB_REGISTERS_PTR CrbReg, IN UINT8 *BufferIn, IN UINT32 SizeIn, IN OUT UINT8 *BufferOut, IN OUT UINT32 *SizeOut ) edk2/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Tis.c 1 2 3 4 5 6 7 Tpm2TisTpmCommand ( IN TIS_PC_REGISTERS_PTR TisReg, IN UINT8 *BufferIn, IN UINT32 SizeIn, IN OUT UINT8 *BufferOut, IN OUT UINT32 *SizeOut ) Useful Command VirtuarlBox 7.0 之後可以開啟 TPM 支援 VB file 1 2 3 4 sudo TCTI_PCAP_FILE=- tpm2_getrandom --tcti \u0026#34;pcap:device:/dev/tpm0\u0026#34; -0 rand.bin 5 | wireshark -ki - sudo TCTI_PCAP_FILE=- tpm2_pcrread sha256 --tcti \u0026#34;pcap:device:/dev/tpm0\u0026#34; -o pcr.bin | wireshark -ki - xxd -c 32 pcr.bin echo -e -n helloword\u0026gt;tmp.bin | sudo TCTI_PCAP_FILE=- tpm2_hash -g sha256 tmp.bin --tcti \u0026#34;pcap:device:/dev/tpm0\u0026#34; --hex | wireshark -ki - my_random.c code gcc -o my_random my_random.c -ltss2-esys -ltss2-rc\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include \u0026lt;stdlib.h\u0026gt; #include \u0026lt;stdio.h\u0026gt; #include \u0026lt;tss2/tss2_esys.h\u0026gt; #include \u0026lt;tss2/tss2_rc.h\u0026gt; int main() { ESYS_CONTEXT *context = NULL; // ESYS 初始化 TSS2_RC rc = Esys_Initialize(\u0026amp;context, NULL, NULL); // 檢查 ESYS 初始化是否成功 if (rc != TSS2_RC_SUCCESS) { fprintf(stderr, \u0026#34;Esys_Initialize: %s\\n\u0026#34;, Tss2_RC_Decode(rc)); return EXIT_FAILURE; } TPM2B_DIGEST *bytes = NULL; // 使用 TPM 產生亂數 rc = Esys_GetRandom(context, ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE, 8, // 產生的亂數資料長度 \u0026amp;bytes); // 檢查 TPM 產生亂數是否成功 if (rc != TSS2_RC_SUCCESS) { fprintf(stderr, \u0026#34;Esys_GetRandom: %s\\n\u0026#34;, Tss2_RC_Decode(rc)); return EXIT_FAILURE; } // 輸出亂數 for (size_t i = 0; i \u0026lt; bytes-\u0026gt;size; i++) { printf(\u0026#34;%02x\u0026#34;, bytes-\u0026gt;buffer[i]); } printf(\u0026#34;\\n\u0026#34;); Esys_Free(bytes); Esys_Finalize(\u0026amp;context); return EXIT_SUCCESS; } Linux TPM 相關\n1 2 3 cat /sys/class/tpm/tpm0/pcr-sha256/0 sudo xxd /sys/kernel/security/tpm0/binary_bios_measurements sudo cat /proc/iomem | grep fed UEFI Qemu 相關\n1 2 3 4 5 6 7 8 sudo apt install swtpm mkdir /tmp/mytpm1 swtpm socket --tpmstate dir=/tmp/mytpm1 --ctrl type=unixio,path=/tmp/mytpm1/swtpm-sock --tpm2 --log file=tpm.log,level=20 sudo qemu-system-x86_64 -m 1024 -bios Build/OvmfX64/DEBUG_GCC5/QEMU/bios.bin -serial stdio -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0 \u0026gt; boot.log sudo bash OvmfPkg/build.sh -a X64 -D SECURE_BOOT_ENABLE -D TPM2_ENABLE sudo bash OvmfPkg/build.sh -a X64 -D SECURE_BOOT_ENABLE -D TPM2_ENABLE -D DEBUG_ON_SERIAL_PORT qemu-system-x86_64 -machine q35,smm=on -m 1024 -bios Build/OvmfX64/DEBUG_GCC5/QEMU/bios.bin -serial stdio Refer TPM 2.0 Library TCG PC Client Platform TPM Profile (PTP) Specification TCG PC Client Specific Platform Firmware Profile (PFP) Specification TCG PC Client Physical Presence Interface (PPI) Specification TCG PC Client Device Driver Design Principles (DDD) for TPM 2.0 TCG PC Client Specific TPM Interface Specification (TIS) TCG PC Client Platform Firmware Integrity Measurement (FIM) tpm2-tss @github TPM2 Guide TPM2 Guide CN TCG TPM v2.0 Provisioning Guidance TCG EFI Platform Specification TCG EFI Protocol Specification UEFI Secure Boot EDK II Security White Papers IC TPM Certified Products Infineon, All resources STM, All resources Microchip Nuvoton Web TPM 2.0 Library , PC Client , PC Client Device Driver Design , UEFI white paper , kernel doc about tpm\ntpm2-tools , TPM2-TSS , m$_tpm2.0 , Software TPM Emulator , tpm-js\nwiki , Linux 使用 TPM 2.0 產生真實隨機亂數教學與範例 , kernel TPM doc , 初探 TPM 2.0 , TPM 2.0规范解读系列 , TPM分析笔记 , TPM学习笔记 , PTP协议-1 , PTP协议-2 , 檢測TPM , kernel , Using the tpm-elinux , 略談信賴運算（一） , 略談信賴運算（二） , 略談信賴運算（三） , 略談信賴運算（四） , 密碼學簡史 , 可信賴運算(Trusted Computing) , TPM 密钥证明 , TPM Specification Overview , A mobile and portable trusted computing platform , Secure Boot using Trusted Firmware-M , Trusted Platform Module , BIOS Chronomancy : Fixing the Core Root of Trust for Measurement , A Novel Approach for a Flexible and Secure Update of Cryptographic Engines on a Trusted Platform Module , Trusted Platforms UEFI, PI and TCG-based firmware , 基于静态可信根(SRTM)的Bitlocker的工作原理是什么？ , 嵌入式設備的基本應用\u0026ndash;TPM 2.0 , TPM2.0 Key hierarchies筆記 , TPM 2.0 裝置上的 PCR , Designing in A Designing in A Trusted Platform Module (TPM) Trusted Platform Module (TPM , TPM.dev tutorials , 【可信计算】复习篇 , 【可信计算】第五次课：可信计算规范与标准 , 【TPM2.0原理及应用指南】 1-3章 , 【TPM2.0原理及应用指南】 5、7、8章 , Research on trusted computing and its development , Advanced Trusted Platform Module (TPM) Usage , UEFI Utility to Read TPM 2.0 PCRs , 解碼測量開機記錄以追蹤 PCR 變更 , What\u0026rsquo;s the difference between the endorsement key and the attestation identity key within the TPM? , UEFI安全启动 , Core Root of Trust for Measurement , 代碼範例：使用Intel® Platform Trust Technology , TPM2 Software Stack (TSS2) , The Trusted Platform Module key hierarchy , From TPM 1.2 to 2.0 and some more , Citizen Electronic Identities using TPM 2.0 , Secure the Windows boot process , BIOS Integrity Measurement Guidelines , Platform Firmware Resiliency Guidelines , TCG TRUSTED BOOT CHAIN IN EDK II , Understanding the UEFI Secure Boot Chain , Understanding UEFI Secure Boot and how it helps to secure the Windows 10 boot process , Trusted Computing Overview , A BAD DREAM: SUBVERTING TRUSTED PLATFORM MODULE WHILE YOU ARE SLEEPING , Force firmware code to be measured and attested by Secure Launch on Windows 10 , UEFI Secure Boot , Step to UEFI (238）OVMF 从第一条指令到 SecMain , 在Linux安装Windows 11 QEMU虛擬機時啟用Secure Boot和TPM 2.0 , 分析Edk2启动流程 , Optiga TPM SPI 治具簡易檢測TPM方式指引 , STPM4RasPI expansion board , 以 Windows 为例初步理解 Secure Boot、Trusted Boot、Measured Boot 和 TPM , Bitlocker Unlocked with Joy – Behind the Scenes Windows 10 , 應用金鑰加密技術的車輛防盜系統 , 量化 OPTIGA™ TPM 預配服務產品說明 , 以量化 TPM 簽署金鑰(EK)白名單註冊及驗證 Azure DPS 服務 , TPM2.0远程证明仿真\n金鑰衍生函式 , NIST SP 800-108密钥导出函数KDF研究 , 安全與密碼學 , 加密演算法基礎介紹\nBreaking Bitlocker - Bypassing the Windows Disk Encryption , Windows 安全開機金鑰建立和管理指南 , OEM Activation 3.0 系統\nTable TPM 2.0 Part 1: Architecture 5.2 有縮寫\nTPM: Trusted Platform Module 信賴平台模組 ECC: Elliptic Curve Cryptography 橢圓曲線密碼學 NIST: National Institute of Standards and Technology 美國國家標準暨技術研究院 PCR: Platform Configuration Register SML: Store Measurement Log NV: Non-Volatile 非揮發性 EK: Endorsement Key 認證密鑰 CA: Certificate Authority 數位憑證認證機構 CRTM: Core of Root of Trusted for Measurement SRTM: Static Root of Trust for Measurement RTM: Root of Trust for Measurement RTS: Root of Trust for Storage RTR: Root of Trust for Reporting EPI: Extended Peripheral Interface 擴充週邊介面 GPIO: General purpose I/O ","date":"2024-03-07T00:00:00Z","image":"https://www.d0ngy3.com:443/p/tpm2/title_hu_fd3cd861ff718760.jpg","permalink":"https://www.d0ngy3.com:443/p/tpm2/","title":"TPM 2.0"},{"content":"2023東京輕井澤遊記 Date: 20231206~20231210\n20231206 我們搭乘因機械故障延誤了快三個小時的 BR192 班機抵達羽田機場，接著坐 JR 到軽井沢駅，到的時候天都黑了而且有點冷，一行人拖著行李搭公車到星のや軽井沢，然後摸黑走了一段路才到 lobby check-in，到各自的小屋放好行李就出發村民食堂吃晚餐，吃完晚餐想說距離酒吧預約還有一段時間，就走路去 7-ELEVEN 買東西，當然一路又黑又冷好在 7-ELEVEN 還沒打烊買了點東西，之後就到預約的酒吧 イカルカフェ，一進門兩個字溫暖，原來是有壁爐，喝完大家就散了回到各自小屋泡澡休息。\n20231207 第二天早上我們有預約客房早餐，早上 9:00 起來舒服的吃著早餐然後出門去輕井澤千住博美術館，畢竟是室內設計公司的員工旅遊，參訪環節還是不可少的，離開美術館一路走到ツルヤ 軽井沢店採買了一些吃的喝的，經過カフェシュクレ 軽井沢焙煎所、Mel ミル 一路邊走邊逛到中軽井沢駅搭車回去星のや軽井沢，下午去星野温泉 トンボの湯泡湯，泡湯完一路晃到 ハルニレテラス 看看，不過天黑變很冷因此回程就搭飯店的接駁車回到 lobby，晚上在房間簡單吃一下泡面就出發去星のや軽井沢 メディテイションバス泡湯，與蜻蜓之湯不同冥想之湯只有虹夕諾雅住客能去，也因為我們去的時間是 21:00 多也因此沒什麼人，總的來說很特別的泡湯體驗，最裡面的空間真的適合冥想，泡完湯出來看看星星跟散落在河岸的小屋，享受當下的靜謐，不過還是會冷因此趕緊滾回小屋休息，題外話出來的時候居然遇到一對說中文的\u0026quot;情侶\u0026quot;，但是女生妝特別濃不像是老婆!?\n20231208 第三天有預約早晨瑜珈，因此早上 7:30 就出發去茶室，說是瑜珈我倒覺得像是伸展操，BTW 又遇到昨天晚上泡湯那對\u0026quot;情侶\u0026quot;，伸展完就回到房間收拾行李準備退房，退房後大家又在附近各種拍照，拍了一頓之後才依依不捨的上車離開，發車時飯店的工作人員一字排開目送我們離去，不虧是最頂的虹夕諾雅，這體驗從頭到尾都是滿分，會到台灣後我還是一再回味，到軽井沢駅因為還有時間，因此我們拖著行李到旁邊的軽井沢・プリンスショッピングプラザ 逛逛，不過逛了一圈沒買什麼，倒是要搭車時發現便利商店有賣軽井沢伴手禮，就買了一些順便買點飲料跟吃的車上吃，搭到東京車站後拖著行李到 Daiwa Roynet Hotel Tokyo Kyobashi check-in，之後陪女友去看耳鼻喉科，好在虛驚一場身體沒有問題，也順便解鎖在日本看病的經歷，晚上就在秋葉原逛逛吃晚餐，逛完回飯店大概 23:00 想說來都來了，來場夜遊東京車站，不過女友走一半哭出來又是另一個故事了。\n20231209 第四天早上 10:00 出發去澀谷，因為我們有預約 12:00 澀谷 SKY，到澀谷逛了一下 UNIQLO 就趕去澀谷 SKY，從高空看澀谷的風景真的不錯，在上面拍完照後就出發到下一站原宿 Vegan Bistro Jangara 吃午餐，這間推推好吃，之後我們分頭行動，女友去＠cosme TOKYO 瘋狂採購，我去明治神宮逛逛，之後我們到 UNIQLO 原宿會合，對又去 UNIQLO 把早上看到想買的買起來，日本 UNIQLO 不只便宜而且有些款式台灣根本沒有，我有一件日本 UNIQLO 買的毛衣，台灣 UNIQLO 跑了三間完全沒有，所以日本看到喜歡的不要猶豫啊!!買完衣服後坐電車回飯店，女友覺得累了在飯店休息，而我又走去東京車站附近的 KITTE丸の内逛，原本想買個 snow peak 鈦杯當紀念，不過逛了一圈還是下不了手，不過這棟 KITTE丸の内滿好逛的，有許多特色的店，逛完回到東京車站的拉麵街，與睡醒的女友會合吃そらのいろNIPPON，這家拉麵也是推推，吃完就散步回飯店，因為隔天要早起。\n20231210 第五天早上 7:00 就匆忙退房，因為我們要趕 12:00 的 BR191 班機，因此沒有什麼行程，我就只有隨手拍一些，不過整理時才發現，這些隨手拍的都好漂亮。\n旅遊紀錄~ ","date":"2023-12-06T00:00:00Z","image":"https://www.d0ngy3.com:443/p/2023tokyo/title_hu_65b2086de94c59d2.JPG","permalink":"https://www.d0ngy3.com:443/p/2023tokyo/","title":"2023東京"},{"content":"1.1 Let\u0026rsquo;s start! Qemu 是一個通用的開源電腦模擬器和虛擬機。它可以模擬各種硬件平台,包括 x86、ARM、PowerPC 等 CPU 架構,也可以運行多種作業系統,如 Linux、Windows、macOS 等。 Qemu 的主要作用包括:\n完整系統仿真:可以在不同硬件架構上模擬整個計算機系統,包括 CPU、內存、硬盤、網卡等硬件設備。這對於跨平台開發、測試新操作系統、探索新硬件架構都很有用。 作為虛擬機監控程序(hypervisor): Qemu 可以託管客戶操作系統,為其提供虛擬化的硬件環境。這種方式通常性能更好,接近於在物理硬件上運行。 用戶模式仿真: Qemu 也可以只模擬目標系統的用戶空間,而不模擬完整的系統。這對於移植軟件、跨平台開發很有幫助。 系統調試和分析:通過QEMU模擬,可以更好地追蹤和理解系統的行為,檢測潛在的 bug。 總的來說, Qemu 作為一個靈活且精確的虛擬化解決方案,被廣泛應用於軟件開發、系統移植、硬件模擬等多個領域。\n1.1.0 Toolkit buildroot\nbusybox\nkernel 5.x\nARMv8 cross compiler\n1 2 sudo apt install gcc-aarch64-linux-gnu #64bit sudo apt install gcc-arm-linux-gnueabi #32bit 1.1.1 qemu+kernel Reference 使用qemu搭建ARM64调试环境，支持文件共享，支持gdb调试 Linux kernel QEMU setup QEMU运行ARM Linux内核 qemu初步 QEMU学习笔记 https://youtube.com/playlist?list=PLdrYbn8q6soONlL-aEc9b8bKeAtgK0VmB Buildroot架構解析 核心編譯_鳥哥 Install and Build QEMU simulator 1.1.2 Linux 開發板資料 LubanCat MangoPi Yuzukilizard 1.2 buildroot 使用簡單的方式 (累= =) 1. 2. 3. 4.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 sudo apt update sudo apt update #升級套件 sudo apt install gcc-aarch64-linux-gnu -y #安裝aarch64 cross compiler ls /usr/bin/ | grep gcc* #列出安裝gcc sudo apt install qemu-system -y #安裝qemu ls /usr/bin/ | grep qemu #列出qemu安裝的架構 mkdir qlinux cd qlinux wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.117.tar.xz #下載kernel tar -Jvxf linux-5.15.117.tar.xz git clone https://github.com/buildroot/buildroot.git #下載buildroot cd buildroot make qemu_arm_vexpress_defconfig #ARM926EJ-S，使用 Versatile Express 配置文件 sudo make sudo qemu-system-arm -M vexpress-a9 -smp 2 -m 1024 \\ -kernel output/images/zImage -dtb output/images/vexpress-v2p-ca9.dtb \\ -drive file=output/images/rootfs.ext2,if=sd,format=raw \\ -append \u0026#34;console=ttyAMA0,115200 root=/dev/mmcblk0\u0026#34; \\ -serial stdio -net nic,model=lan9118 -net user -display none buildroot login: root\nYocto\n1.3 Raspberry pi 3b Emulating a Raspberry Pi in QEMU Raspberry Pi 4 emulation with QEMU virt https://pominglee.blogspot.com/p/linux.html\nqemu編譯 64-bit Raspberry PI 3B with Qemu in 2023\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 sudo apt update sudo apt update #升級套件 sudo apt install gcc-aarch64-linux-gnu -y #安裝aarch64 cross compiler ls /usr/bin/ | grep gcc* #列出安裝gcc # sudo apt install qemu-system -y #安裝qemu # ls /usr/bin/ | grep qemu #列出qemu安裝的架構 git clone https://gitlab.com/qemu-project/qemu.git cd qemu git submodule init git submodule update --recursive cd build sudo ../configure --enable-slirp sudo make -j sudo make install wget https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2022-09-26/2022-09-22-raspios-bullseye-arm64-lite.img.xz xz -d 2022-09-22-raspios-bullseye-arm64-lite.img.xz ls -la fdisk -l 2022-09-22-raspios-bullseye-arm64-lite.img sudo mkdir /mnt/image sudo mount -v -o offset=$((512*8192)) ./2022-09-22-raspios-bullseye-arm64-lite.img /mnt/image/ ls -ls /mnt/image/ cp /mnt/image/bcm2710-rpi-3-b.dtb /mnt/image/kernel8.img ./ sudo touch /mnt/image/ssh sudo umount /mnt/image qemu-img resize ./2022-09-22-raspios-bullseye-arm64-lite.img 4G # qemu-system-aarch64 -machine raspi3b -cpu cortex-a53 -smp 4 -m 1G -kernel kernel8.img -dtb bcm2710-rpi-3-b.dtb -sd 2022-09-22-raspios-bullseye-arm64-lite.img -append \u0026#34;root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4\u0026#34; -usbdevice keyboard -usbdevice mouse -device usb-net,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2022-:22 qemu-system-aarch64 -machine raspi3b -cpu cortex-a53 -nographic -smp 4 -m 1G \\ -kernel kernel8.img -dtb bcm2710-rpi-3-b.dtb -sd 2022-09-22-raspios-bullseye-arm64-lite.img \\ -append \u0026#34;root=/dev/mmcblk0p2 rw rootwait console=ttyAMA0,115200 dwc_otg.lpm_enable=0 rootfstype=ext4\u0026#34; \\ -display none -usbdevice keyboard -usbdevice mouse -device usb-net,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2022-:22 1.4 virtualbox 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include \u0026lt;linux/init.h\u0026gt; #include \u0026lt;linux/module.h\u0026gt; #include \u0026lt;linux/blkdev.h\u0026gt; MODULE_LICENSE(\u0026#34;Dual BSD/GPL\u0026#34;); #define MY_BLOCK_MAJOR\t240 #define MY_BLKDEV_NAME\t\u0026#34;my_block\u0026#34; static __init int my_block_init(void) { int status; status = register_blkdev(MY_BLOCK_MAJOR, MY_BLKDEV_NAME); if (status \u0026lt; 0) { printk(KERN_ERR \u0026#34;unable to register mybdev block device\\n\u0026#34;); return -EBUSY; } printk(KERN_INFO \u0026#34;Hello kernel\\n\u0026#34;); return 0; } static void __exit my_block_exit(void) { printk(KERN_INFO \u0026#34;Goodbye\\n\u0026#34;); unregister_blkdev(MY_BLOCK_MAJOR, MY_BLKDEV_NAME); } module_init(my_block_init); module_exit(my_block_exit); ","date":"2023-09-28T00:00:00Z","image":"https://www.d0ngy3.com:443/p/qemu/Qemu_logo.svg","permalink":"https://www.d0ngy3.com:443/p/qemu/","title":"什麼是 Qemu？如何使用？"},{"content":"網路相關知識整理 WIFI WiFi 標準比較（WiFi 4 ~ WiFi 7） WiFi 標準 IEEE 版本 最高傳輸速率 頻段 最大頻寬 調變技術 WiFi 4 802.11n 600 Mbps 2.4GHz、5GHz 40 MHz 64-QAM WiFi 5 802.11ac 6.9 Gbps 5GHz 160 MHz 256-QAM WiFi 6 802.11ax 9.6 Gbps 2.4GHz、5GHz 160 MHz 1024-QAM WiFi 6E 802.11ax 9.6 Gbps 2.4GHz、5GHz、6GHz 160 MHz 1024-QAM WiFi 7 802.11be 46 Gbps 2.4GHz、5GHz、6GHz 320 MHz 4096-QAM 主要技術改進 WiFi 5（802.11ac） 只支援 5GHz 頻段 導入 MU-MIMO（多用戶多輸入多輸出）技術 提升最大頻寬至 160 MHz WiFi 6（802.11ax） 支援 2.4GHz + 5GHz 頻段 新增 OFDMA（提升多設備並行傳輸效率） 提升 1024-QAM（提升數據傳輸效率） WiFi 6E（擴展版） 在 WiFi 6 基礎上增加 6GHz 頻段 減少擁擠，提高穩定性 WiFi 7（802.11be） 頻寬提升至 320 MHz 4K-QAM（4096-QAM），數據吞吐量更高 MLO（Multi-Link Operation），多頻段同時使用，提高速度與穩定性 多用戶 MU-MIMO 擴展至 16x16 Router vs Switch vs AP 比較 功能 Router（路由器） Switch（交換器） AP（無線存取點） 主要用途 連接不同網路、管理 IP 內部設備互連（有線） 提供 WiFi 無線網路 IP 分配 ✅（DHCP） ❌（僅透過 MAC 位址傳輸） ❌（依賴路由器） NAT（IP 轉換） ✅ 有 ❌ 無 ❌ 無 VLAN 支援 🚫（家用路由器無） ✅ 部分管理型支援 ❌ 無 WiFi 功能 ✅ 內建（部分路由器） ❌ 無 ✅ 提供無線網路 適用場景 家用、企業網關 內部網路擴展 擴展無線網路 Router（路由器） → 負責「對外」連接網際網路，管理 IP Switch（交換器） → 負責「內部」設備互連，提升有線網路效能 AP（無線存取點） → 提供 WiFi 訊號，擴展無線網路覆蓋範圍 PPPoE vs DHCP 差異比較 特性 PPPoE（撥號） DHCP（自動獲取 IP） 是否需要帳號密碼 ✅ 需要 ❌ 不需要 IP 配置方式 透過 ISP 撥號分配 自動分配（由 DHCP 伺服器管理） 是否需要手動設定 ✅ 需要設定帳號密碼 ❌ 無需設定，插上網路線即可 適用場景 ADSL、VDSL、部分光纖 光纖、Cable Modem、內部 LAN 是否支援動態 IP ✅ 通常為動態 IP ✅ 預設為動態 IP，但可設定固定 IP 安全性 相對較高，因為需要認證 相對較低，任何設備都能獲取 IP PPPoE（Point-to-Point Protocol over Ethernet） PPPoE（Point-to-Point Protocol over Ethernet，乙太網路點對點通訊協議） 是一種網路通訊協議，常用於 寬頻上網（例如 ADSL、光纖 FTTH），主要功能是讓多個用戶透過乙太網路連接 ISP（網際網路服務供應商）。\nDHCP（Dynamic Host Configuration Protocol） DHCP（動態主機設定協議）是一種自動分配 IP 位址 的技術，讓設備在連接網路時無需手動設定 IP。\n簡單理解 PPPoE：需要「撥號」才能上網，適用於 ISP 需要帳號密碼驗證的網路（如 ADSL）。 DHCP：插上網線就能用，適用於大部分家用與企業網路（如光纖、Cable Modem、內部 LAN）。 RJ45 T568A標準：綠白—綠—橙白—藍—藍白—橙—棕白—棕 T568B標準：橙白—橙—綠白—藍—藍白—綠—棕白—棕 理論上來說網路互連需要網路線一端為T568B一端為T568A，也就是Tx對Rx才能傳輸資料，但因為Auto-MDIX這個技術，在網路PHY層，自動調撥收與送的邏輯線路，所以目前常見做法為網路線兩端都為T568B 一端為T568B一端為T568A稱為交叉線，兩端都為T568B稱為直通線\nPin# 橙白 橙 綠白 藍 藍白 綠 棕白 棕 訊號 TX_D1+ TX_D1- RX_D2+ BI_D3+ BI_D3- RX_D2- BI_D4+ BI_D4- TCP/IP TCP/IP參考模型 應用層 application layer HTTPS, TLS／SSL, SSH, FTP, DHCP 傳輸層 transport layer TCP, UDP 網路互連層 internet layer IP(IPv4,IPv6) 網路存取層 Network Access layer Ethernet, WiFi IP 網際網路協定（英語：Internet Protocol，縮寫：IP）是用於封包交換資料網路的協定。\nIP 是建立網絡連接的主要方式，奠定了 Internet 的基礎。 IP 不負責數據包排序或錯誤檢查。這樣的功能需要另一種協議，通常是 TCP。\nTCP 傳輸控制協定（英語：Transmission Control Protocol，縮寫：TCP）是一種連接導向的、可靠的、基於位元組流的傳輸層通信協定，由IETF的RFC 793定義。\nTCP 用三路握手（或稱三次握手，three-way handshake）過程建立一個連接。\n1 2 3 4 5 sequenceDiagram; Note over Client,Server: establish connection Client-\u0026gt;\u0026gt;Server: SYN J Server-\u0026gt;\u0026gt;Client: SYN K/ACK J+1 Client-\u0026gt;\u0026gt;Server: ACK J+1 TCP Header Format如下所示\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |C|E|U|A|P|R|S|F| | | Offset| Rsrvd |W|C|R|C|S|S|Y|I| Window | | | |R|E|G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | [Options] | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | : : Data : : | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Note that one tick mark represents one bit position. SYN (Synchronize sequence numbers)\n如果有設置，才發出連線請求，用來同步序列號。\nACK (Acknowledgment field significant) 如果有設置，使確認號欄位有效。 1 2 3 4 5 6 7 8 9 10 sequenceDiagram; Note over Client,Server: data transfer Client-)Server: data(request) Server-)Client: data(reply) Client-\u0026gt;\u0026gt;Server: ACK of reply Note over Client,Server: close connection Client-\u0026gt;\u0026gt;Server: FIN M Server-\u0026gt;\u0026gt;Client: ACK M+1 Server-\u0026gt;\u0026gt;Client: FIN N Client-\u0026gt;\u0026gt;Server: ACK N+1 UDP 使用者資料包協定（英語：User Datagram Protocol，縮寫：UDP）是一個簡單的面向資料包的通信協定。\nRefer 網路基礎TCP/IP cloudflare TCP/IP TCP協議 NotFalse 技術客 socket programming C/C++ Linux TCP Socket ","date":"2023-08-30T00:00:00Z","image":"https://www.d0ngy3.com:443/p/net/title_hu_1657c30a9c6a0357.png","permalink":"https://www.d0ngy3.com:443/p/net/","title":"網路"},{"content":"linux tips tags: linux Terminal 文件目錄管理 ls list files 列出目錄及文件名：ls [options] [name]\n-l 將資料以列表形式呈現，並且包含檔案細部資料。 -a 列出所有檔案，包含隱藏檔。 -h 可將檔案容易以易讀式呈現；-r:反向排序；-S:用檔案大小排序；-t:用時間排。序。 cd change directory 切換目錄：cd [dirName]\n~ 是切換 home 目錄的意思。 / 換到絕對路徑，.. 則表示目前目錄位置的上一層目錄；. 則是表示目前所在的目錄。 - 切換到上次訪問的目錄；$VAR_NAME 切換到環境變量指定的目錄。 pwd print work directory 顯示目前的目錄\nmkdir make directory 創建一個新的目錄：mkdir [-p] dirName\n-p 確保目錄名稱存在，不存在的就建一個。 rmdir remove directory 刪除一個空的目錄：rmdir [-p] dirName\n-p 是當子目錄被刪除後使它也成為空目錄的話，則順便一併刪除。 cp copy file 複製文件或目錄：cp [options] [source] [directory]\n-r 或 --recursive 用於復制目錄及其所有的子目錄和文件，如果要復制目錄，需要使用該選項。 -i 或 --interactive 在復制前提示確認，如果目標文件已存在，則會詢問是否覆蓋，回答y時目標文件將被覆蓋；-f 或 --force 強制複製，即使目標文件已存在也會覆蓋，而且不給出提示。 -a 此選項通常在復制目錄時使用，它保留鏈接、文件屬性，並複制目錄下的所有內容。 -v 或 --verbose 顯示詳細的複製過程；-u 或 --update 僅複製源文件中更新時間較新的文件。 -p 或 --preserve 保留源文件的權限、所有者和時間戳信息；-l 不復製文件，只是生成鏈接文件。 rm remove 刪除文件或目錄：rm [options] name\n-i 刪除前逐一詢問確認。 -f 即使原檔案屬性設為唯讀，亦強制刪除，無需確認。 -r 將目錄及以下之檔案亦逐一刪除。 mv move file 移動文件與目錄，或修改文件與目錄的名稱：mv [options] [source] [directory]\n-f 強制搬移，如果檔案存在，不會詢問直接覆蓋；-i 如果目標檔案存在，會詢問是否覆蓋。 -u 當源文件比目標文件新或者目標文件不存在時，才執行移動操作。 -n 不要覆蓋任何已存在的文件或目錄；-b 當目標文件或目錄存在時，在執行覆蓋前，會為其創建一個備份。 硬碟管理 df disk free 顯示目前系統上各個硬碟分割區的狀況：df [options] [name]\n-a 列出所有的文件系統。 -h 根據大小格式調整顯示單位；-k 以 KBytes 的單位顯示各個文件系統；-m 以 MBytes 的單位顯示各個文件系統。 -H 以 M=1000K 替換 M=1024K 的進位方式；-T 顯示文件系統類型。 fdisk 磁碟分區表操作工具：df [options] [device]\n-l 輸出後面接的裝置的所有分區內容。若不是 fdisk -l 時，則係統將會把整個系統內能夠搜索到的裝置的分區均啟動來。 由於 MBR 分割表不支援超過 2TB 的磁碟，如果您的硬碟大小超過 2TB，就無法使用 fdisk 分割硬碟，請改用 parted 以 GPT 的方式分割。\ndu disk used 查看資料夾或檔案大小：du [options] [name]\n-a 列出所有的檔案大小。 -h 根據大小格式調整顯示單位；-k 以 KBytes 的單位顯示各個文件系統；-m 以 MBytes 的單位顯示各個文件系統。 -s 只顯示總和；-S 顯示目錄內容時, 不包含子目錄大小。 tree 命令用於以樹狀圖列出目錄的內容\n-a 顯示所有文件和目錄。 -d 顯示目錄名稱而非內容。 -f 顯示完整的相對路徑名稱，-s:列出文件或目錄大小，-h:可將檔案容易以易讀式呈現; uname unix name 命令用於顯示操作系統信息\n-a 或 --all 顯示全部的信息，包括內核名稱、主機名、操作系統版本、處理器類型和硬件架構等。 -r 或 --release 顯示內核版本號；-v 顯示操作系統的版本。 -n 或 --nodename 顯示主機名；-m 或 --machine 顯示處理器類型，-s 或--sysname 顯示操作系統名稱。 ftp 命令設置文件系統相關功能。ftp [- dignv][主機名稱或IP地址]\n-d 詳細顯示指令執行過程，便於除錯或分析程序執行的情形； -i 關閉互動模式，不詢問任何問題； -v 顯示指令執行過程；-g 關閉本地主機文件名稱支持特殊字符的擴充特性； -n 不使用自動登陸。 quit 結束遠端伺服器的 ftp 會話，然後結束。 常用 FTP 命令 ! 對本地電腦下 command。e.g.!ls open 連接到指定的 ftp 伺服器。open [computer] [port] close 結束與遠端伺服器的 ftp 會話，並保留在提示字元中 ftp\u0026gt;。 help 命令或 ? 列出所有可用的FTP命令；cd 命令切換遠端伺服器目錄；lcd 命令切換本地電腦目錄；ls命令列出當前遠程目錄文件與目錄； pwd顯示遠端伺服器上的當前工作目錄。 delete 命令刪除當前遠程目錄中的文件； mkdir命令在當前遠程目錄中創建一個新目錄； rmdir 刪除當前遠程目錄中的目錄。 get 將一個文件從遠程複製到本地電腦； mget 命令將多個文件從遠程複製到本地電腦； put 命令將一個文件從本地上傳到遠端伺服器； mput 命令將多個文件從本地上傳到遠端伺服器。 tar 用於打包檔案產生 tar 包，也可以將檔案打包並壓縮\n以下五個是獨立的命令，壓縮解壓都要用到其中一個，可以和別的命令連用但只能用其中一個。 -c 建立壓縮檔案 -x 解壓 -t 查看內容 -r 向壓縮歸檔文件末尾追加文件 -u 更新原壓縮包中的文件 下面的參數是根據需要在壓縮或解壓檔案時可選的。 -z 有gzip屬性的； -j 有bz2屬性的； -Z 有 compress 屬性的； -v 顯示所有過程； -O將文件解開到標準輸出 -f 目標檔案，這個參數是最後一個參數，後面只能接檔案名。 grep global regular expression 命令用於查找文件裡符合條件的字符串或正則表達式。grep [ options ] pattern [ files ]\npattern - 表示要查找的字符串或正則表達式。\nfiles - 表示要查找的文件名，可以同時查找多個文件，如果省略files 參數，則默認從標準輸入中讀取數據。\n-r 遞歸查找子目錄中的文件。 -i 忽略大小寫進行匹配；-v 反向查找，只打印不匹配的行。 -n顯示匹配行的行號；-l只打印匹配的文件名。-c只打印匹配的行數。 find 用於在指定目錄下查找文件和目錄。find [path] [expression]\npath是要查找的目錄路徑，可以是一個目錄或文件名，也可以是多個路徑，多個路徑之間用空格分隔，如果未指定路徑，則默認為當前目錄。 expression是可選參數，用於指定查找的條件，可以是文件名、文件類型、文件大小等等。\n-name pattern：按文件名查找，支持使用通配符*和?。 -type type：按文件類型查找，可以是f（普通文件）、d（目錄）、l（符號鏈接）等。 -size [+-]size[cwbkMG]：按文件大小查找，支持使用 + 或 - 表示大於或小於指定大小，單位可以是 c (字節)、 w (字數)、 b (塊數)、 k (KB)、 M (MB)或 G (GB)。 -mtime days：按修改時間查找，支持使用 + 或 - 表示在指定天數前或後，days 是一個整數表示天數； -user username：按文件所有者查找； -group groupname：按文件所屬組查找。 man manual 後面加上其他指令，就可以看到指令的文件及其他說明。\ntime 命令的用途，在於量測特定指令執行時所需消耗的時間及系統資源等資訊。\nlshw lspci htop tmux touch chmod ssh scp\nnet-tools ifconfig ethtool netstat nameif ipmaddr route\nvi/vim git 後臺相關 \u0026amp; 這個用在一個命令的最後，可以把這個命令放到後臺執行;\nctrl + z 可以將一個正在前臺執行的命令放到後臺，並且暫停;\njobs 檢視當前有多少在後臺執行的命令;\nfg 將後臺中的命令調至前臺繼續執行;\nbg 將一個在後臺暫停的命令，變成繼續執行;\nps 列出系統中正在執行的程序;\nkill 傳送訊號給一個或多個程序(經常用來殺死一個程序)，kill還能給程序傳送其它訊號，使用kill -l 可以察看kill支援的訊號;\nwatch 一個可以定期執行指令的實用工具，臨時需要定期執行指令時特別有用，-n:更新間隔時間，時間精細度可支援到 0.1 秒，-d:每次畫面更新時，將產生差異的部分輸出反白顯示;\nNvidia nvidia-smi Nvidia 所提供的 NVIDIA System Management Interface 管理工具可以直接查詢驅動程式與顯示卡的資訊，-L 參數可列出所有插在電腦上的 GPU 卡，-q 參數可列出 GPU 卡非常詳細的資訊;\nGCC -c : 只做編譯(不做連結)\n-S : 輸出組譯碼\n-E : 將預處理結果顯示\n-o filename : 指定輸出檔名\n-ansi : 程式要求依據ansi c標準\n-Dmacro : 使定義巨集(marco)為有效\n-Dmarco=defn : 使定義巨集(marco)為defn\n-Wa,option : 將選項(option)傳給組譯器\n-wl,option : 將選項(option)傳給連結器\n-I : 追加include檔案的搜尋路徑\n-L : 追加library檔案的搜尋路徑\n-l : 指定連結的函式庫\n-Wall : 顯示所有的警告訊息\n-g : 編入除錯資訊(要使用GDB除錯一定要加)\n-O2 : 做最佳化\n虛擬機安裝步驟 下載VM軟體 與 ubuntu映像檔\n開啟VM軟體後建立新機器，將映像檔掛載到光碟機進行安裝，之後按步驟安裝。 (圖形控制器選擇VBoxSVGA可以任意縮放模擬器視窗)\nlinux終端機快捷鍵 1 Ctrl+Alt+T 安裝 vim 1 $ sudo apt install vim 安裝 git 1 $ sudo apt install git 安裝 clip 1 $ sudo apt install geomview 下載 chrome 1 $ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 安裝 chrome 1 $ sudo apt install -y -f ./google-chrome-stable_current_amd64.deb 建立捷徑 1 /usr/share/applications/google-chrome.desktop 將路徑指向 1 http://wiki.csie.ncku.edu.tw/linux/schedule SSH key 產生的方法 ($ 開頭的表示法，就是說明在 Linux 終端機輸入命令)\n:::info 透過以下命令檢查是否有現存的 ssh key\n1 $ ls -al ~/.ssh 如果已有 ssh key，跳到步驟 5 若沒有從步驟 1 開始 ::: 1. 輸入命令 1 $ ssh-keygen -t rsa -C \u0026#34;your_email@example.com\u0026#34; 後面那是自己申請 Github 所使用的信箱。之後 ssh 程式會要求輸入 passphrase\n2. 直接按下 Enter 鍵即可。 Enter file in which to save the key (/Users/[you]/.ssh/id_rsa): [Press enter]\n3. 輸入一個 passphrase，如不想輸入直接按下 Enter 鍵即可。 1 2 Enter passphrase (empty for no passphrase): [Type a passphrase] Enter same passphrase again: [Type passphrase again] 4. 此時顯示的是你 SSH Key 的 fingerprint 1 2 3 4 Your identification has been saved in /Users/[you]/.ssh/id_rsa. Your public key has been saved in /Users/[you]/.ssh/id_rsa.pub. The key fingerprint is: 0x:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com 5. 將剛剛產生的 key 加入 ssh-agent 中 如果你使用的是 Linux 或 msysgit 等軟體，則輸入以下命令 1 2 3 # start the ssh-agent in the background $ eval `ssh-agent -s` Agent pid 59566 將剛剛產生的 key 加入 ssh-agent 中 1 $ssh-add ~/.ssh/id_rsa 6. 到 Github 網站加入你的 SSH key 將 SSH key 複製到你的剪貼簿，如果你的 key 檔案名稱不為 id_rsa.pub，請自行將以下程式碼中 id_rsa.pub 修改成你的檔案名稱。\n1 2 $ clip \u0026lt; ~/.ssh/id_rsa.pub #Copies the contents of the id_rsa.pub file to you clipboard 登入github點選右上角settings\n點選SSH and GPG Keys\n選擇 Add SSH key\nTitle 可以自己命名辨識，然後貼上key!!!! 按下 Add key就完成啦!\n7. 驗證你有沒有綁定 輸入 ssh -T git@github.com 1 2 $ ssh -T git@github.com #Attempts to ssh to GitHub 你會看到這個 warning，然後輸入\u0026quot;yes\u0026quot; 1 2 3 The authenticity of host \u0026#39;github.com (207.97.227.239)\u0026#39; can\u0026#39;t be established. RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Are you sure you want to continue connecting (yes/no) ? 你將會看到 1 Hi [username]! You\u0026#39;ve successfully authenticated, but GitHub does not provide shell access. 這樣就成功囉!\nCtrl+Alt+T =\u0026gt; 開terminal tmux =\u0026gt; 多視窗 Ctrl+L =\u0026gt; clear cat =\u0026gt;列印出文件 ls =\u0026gt;清單 rm =\u0026gt;刪除 cd =\u0026gt;改變路徑 cp =\u0026gt;複製 Docker\u0026ndash;從入門到實踐 docker build -t image名稱 . 根據dockerfile產生images。\u0026quot;-t\u0026quot; 為指定名稱, \u0026ldquo;.\u0026ldquo;為當前位置\ndocker images 查看所有images。\ndocker ps -a 列出當前container。\u0026quot;-a\u0026quot;所有檔案, \u0026ldquo;-s\u0026quot;顯示大小\ndocker container ls -a 列出當前container。\u0026ldquo;ls\u0026quot;表列, \u0026ldquo;-a\u0026quot;所有檔案\ndocker run -it --shm-size 大小 --rm --gpus all --name container_name -p container_port:local_port -v /home/使用者/data:/data image名稱 bash創建一個container並運行指令。\u0026quot;-i\u0026quot;為互動模式, \u0026ldquo;-t\u0026quot;為配置虛擬終端, \u0026ldquo;-d\u0026quot;為後台運行, \u0026ldquo;\u0026ndash;shm-size\u0026quot;為容器可使用共享記憶體大小, \u0026ldquo;\u0026ndash;gpus all\u0026quot;為使用GPU, \u0026ldquo;\u0026ndash;name\u0026quot;container名稱, \u0026ldquo;-p\u0026quot;為port映射, \u0026ldquo;\u0026ndash;rm\u0026quot;為container終止時自動刪除, \u0026ldquo;-v 本機位置:container位置\u0026quot;為將主機位置映射到container, \u0026ldquo;bash\u0026quot;為使用bash shell終端\ndocker start container名稱 bash 運行已存在container。\ndocker stop container名稱 bash 停止運行container。\ndocker restart container名稱 bash 重啟container。\ndocker exec -it container名稱 bash 進入運行中container。\u0026quot;-i\u0026quot;為互動模式, \u0026ldquo;-t\u0026quot;為配置虛擬終端, \u0026ldquo;-d\u0026quot;為後台運行, \u0026ldquo;bash\u0026quot;為使用bash shell終端 docker rm container_id刪除container。\ndocker rmi images_id刪除images。\n","date":"2023-06-28T00:00:00Z","image":"https://www.d0ngy3.com:443/p/linux-tips/title_hu_52c658eadb2f15e4.jpg","permalink":"https://www.d0ngy3.com:443/p/linux-tips/","title":"Linux \u0026 docker tips"},{"content":"作業系統 Operating System 筆記 Ch1 Introduction 作業系統(Operating system, OS)是管理電腦硬體與軟體資源的電腦程式，同時也是電腦系統的核心與基石。OS 主要有以下兩個功能：\n資源分配者 監控使用者程式的執行，以防止不正常的運作造成對系統的危害 一個標準PC的作業系統應該提供以下的功能：\n行程管理(Processing management) 記憶體管理(Memory management) 檔案系統(File system) 網路通訊(Networking) 安全機制(Security) 使用者介面(User interface) 驅動程式(Device drivers) 作業系統類別 1. Mainframe Systems 最早的計算機之一，更好的可靠性與安全性，應用在醫院銀行等，由Batch演進到Time-sharing。\nBatch\nOS 只是將控制權從一個程式轉移到下一個程式，缺點是一次只有一個程式且無法與使用者交互，CPU使用率低。 Multi-programming\n系統中存在多組行程同時(concurrent)執行，透過Spooling(Simultaneous Peripheral Operation On-Line)的機制讓CPU跟I/O時間重疊，提升 CPU 利用度(注意，不是並行執行(parallel))。\nMulti-programming OS任務有Memory management、CPU scheduling and I/O system。 Time-sharing\nCPU在執行的時候頻繁的在跟device做交換，OS在程式間快速切換，每個程式執行幾個ms，time slot就換下一個程式。\nTime-sharing OS任務有Virtual memory、File system、disk management、Process synchronization and deadlock。 2. Computer-system architecture Desktop Systems\nPersonal computers (PC) – 計算機系統專用於單個用戶有GUI與許多I/O devices方便操作，像是Windows、MacOS、Unix、Linux，但是缺乏對用戶的文件和作業系統保護。\nParallel Systems\n也稱為 multiprocessor or tightly coupled system，多個CPU/核心緊密通訊，通常通過共享內存進行通信，優點是Throughput、Economical、Reliability。通常又可分為SMP與AMP。\nSymmetric multiprocessor system (SMP) 每個處理器運行相同的作業系統 最流行的多處理器架構 需要廣泛的同步來保護數據的完整性 Asymmetric multiprocessor system (AMP) 每個處理器被分配一個特定的任務 一個Master CPU \u0026amp; 多個Slave CPU 常見於超大型系統中 從Processor可分為以下兩種：\nMulti-Core Processor：在同一個die上具有多個core的CPU，在chip上通訊更快，一個多核比多個單核工皓更低。 Many-Core Processor：一個divice上有幾百個計算核心，像是Nvidia GPU，Intel Xeon Phi，TILE64等。 從Memory可分為以下兩種：\nUniform Memory Access (UMA)：目前最常見的代表是對稱多處理器(SMP)，相同的處理器，內存訪問次數相等，最常見的架構。\nNon-Uniform Memory Access (NUMA)：通過物理連接多個SMP來實現，一個SMP可以直接訪問另一個SMP的內存，跨鏈接的內存訪問速度較慢。\nDistributed Systems\n也稱為loosely coupled system，每個處理器都有本地的內存，透過I/O bus或網路相互通信，容易擴展大量節點像是Internet。 Client-Server Distributed System：容易管理與分配資源，但是server會成為瓶頸與單一故障點。 Peer-to-Peer Distributed System：每台機器在分佈式系統中的角色都是相同的(去中心化)，像是bitTorrent，Internet。 Clustered Systems：集群計算機共享存儲並通過局域網 (LAN) 或更快的互連（例如 InfiniBand（高達 300Gb/s））緊密相連。 3. Special-purpose Systems Real-Time Systems \u0026ldquo;Real-time\u0026quot;並不意味著速度，而是要keeping deadlines，保證響應和反應時間，Real-time又可以分為Soft real-time與Hard real-time。\nSoft real-time requirements：不期望錯過deadline，但錯過也不嚴重，一個關鍵的real-time task獲得優先於其他任務，並保持該優先級直到它完成，例如多媒體串流。\nHard real-time requirements：錯過deadline會導致失敗，例如：核電站控制器，Hard real-time通常沒有Secondary storage，資料都存在short term memory或read-only memory (ROM)。 Multimedia Systems\n廣泛的應用程序，包括音頻和視頻文件，例如online TV Embedded Systems\n移動裝置，通常內存較小，電池容量有限，處理器速度慢，顯示器較小。 Computer system 用戶(User)：人、機器、其他computer。 應用程序(Application)：定義系統資源用於解決計算問題的方式。 作業系統(Operating System)：控制和協調硬件/資源的使用。 硬件(Hardware)：提供基本的計算資源(CPU、內存、I/O設備)。\nOperating System的定義 資源分配器：管理和分配資源以確保效率和公平。 控製程序：控制用戶程序的執行和I/O設備的操作，防止計算機出錯和不當使用。 內核Kernel：一直運行的一個程序(其他都是系統/應用程序)。 Operating System的目標： 方便(使computer system易於使用和計算，適用於小型PC)。 效率(有效率使用電腦硬體，適用於大型、共享、多用戶系統)。 Operating System的重要性： 系統 API 是用戶應用程序和硬件之間的唯一接口，API是為通用目的而設計。 OS code不允許任何錯誤，任何中斷（例如無效訪問）都會導致重啟。 OS technology的擁有者控制著軟硬件產業(Wintel)。 Operating systems和computer architecture相互影響。 Modern Operating Systems x86 platform：Linux，Windows Smartphone Mobile OS：iOS，Android Embedded OS：Embedded Linux，RTOS，Raspberry Pi，Xbox Computer-System Organization(計算機組織) 一個或多個CPU、設備控制器通過公共總線連接，提供對共享內存的訪問，並發執行CPU和競爭內存週期的設備。\n每個device controller都有一個local buffers，I/O是從device到device controller的local buffers，CPU將數據從內存移動到device controller的local buffers。\nI/O的操作有兩種 Busy/wait output\nCPU不斷監控等待I/O，但是CPU在監控device時不能做其他工作，很難同時進行其他I/O。 Interrupt I/O\nInterrupt允許device改變CPU的控制流，透過改變CPU的控制流在I/O與user process間切換。\nInterrupt 現代OS都是中斷驅動的，事件的發生由來自hardware或software的中斷發出信號。\nHardware(signal)：可以隨時通過向 CPU 發送信號signal來觸發中斷。 Software(trap)：可能會因錯誤（被零除或無效內存訪問）或用戶對作業系統服務的請求（系統調用）而觸發中斷，稱為trap。 中斷的常用功能 中斷一般通過中斷向量將控制轉移到中斷服務例程，中斷向量包含所有服務(即中斷處理程序)例程的地址(函數指針)。 中斷架構必須保存被中斷指令的地址。 在處理另一個中斷時禁止傳入中斷以防止丟失中斷。 Storage-Device Hierarchy 存儲系統的結構(速度、成本、揮發性)，其中又可大致分為\nMain memory：CPU可以直接訪問的大型存儲介質，RAM(Random Access Memory)。 Secondary storage：主存儲器的擴展，提供非揮發性的大存儲容量，例如Hard disk，tapes。 RAM: Random-Access Memory\nDRAM (Dynamic RAM)：主記憶體(Access Speed:\u0026gt;= 30ns)。 SRAM (Static RAM)：CPU cache(Access Speed:10ns~30ns)。 Disk Mechanism：旋轉磁盤，並透過磁頭去去讀取(寫入)磁盤資料\nCaching：使用中的資料暫時從較慢的存儲，複製到較快的存儲\nCoherency and Consistency Issue：更改register中的副本，使其與其他副本不一致\nSingle task accessing：沒有問題，總是使用Highest level copy。 Multi-task accessing：需要獲取最近的值。 Distributed system：Difficult b.c. copies are on different computers。 Hardware Protection 1.Dual-Mode Operation 共享系統資源需要OS保證一個不正確的程序不會導致其他程序的錯誤執行，提供硬件支持以區分至少兩種操作模式 User mode：代表User執行。 Monitor mode：也叫kernel mode或system mode，代表作業系統執行。 hardware中加入Mode bit以指示當前模式的：kernel(0) or user(1)，當interrupt/trap或故障發生時，hardware切換到Monitor mode。\nPrivileged instructions\nExecuted only in monitor mode Requested by users (system calls) 2. I/O Protection 所有I/O instructions都是Privileged instructions，任何I/O設備在user之間共享，必須確保user program永遠無法在monitor mode下獲得對computer的控制權。 3. Memory Protection Memory Protection，保護中斷向量和中斷服務程序，還有數據訪問與被其他程序over-write。\nHW support：兩個合法可使用地址的寄存器，超出定義範圍的內存受到保護 Base register：保存最小的合法物理內存地址。 Limit register：包含範圍的大小。\n4. CPU Protection -防止user program不返回CPU控制權，造成陷入死循環或無法調用系統服務。\nHW support：定時器Timer，在指定時間後interrupts computer，Timer在每個clock中遞減，當Timer達到值0時，發生interrupts。\nTimer常用於實現time sharing。\nLoad-timer is a privileged instruction。\nCh2 OS Structure OS Services OS服務可大致分為以下這幾種\nUser interface(用戶界面) Program Execution(程式執行) I/O operations(輸入輸出操作) File-system manipulation(文件系統操作) Communication(通訊) Error detection(錯誤檢測) Resource allocation(資源分配) Accounting(計數) Protection and security(保護和安全) User interface CLI (Command Line Interface)\n從用戶獲取命令並執行它，Shell(命令行解釋器，如CSHELL、BASH)。 GUI (Graphic User Interface)\n通常是滑鼠、鍵盤和螢幕，圖標代表文件、程序、動作等，界面中對像上的各種鼠標按鈕會導致各種操作。 Communication 可以使用消息傳遞或共享內存進行通信。\nOS-Application Interface System calls 運行程序的作業系統接口，請求作業系統服務，通過軟件中斷向內核發出的明確請求，通常是組合語言。\n進程控制——中止、創建、終止進程分配/釋放內存 文件管理——創建、刪除、打開、關閉文件 設備管理——讀、寫、重定位設備 信息維護——獲取時間或日期 通訊—發送接收信息 API(Application Program Interface) 用戶主要針對API進行編程而不是system call，通常由language libraries實現，例如 C Library，API 調用可能涉及零個或多個系統調用。\nBoth malloc() and free() use system call brk()\nMath API functions, such as abs(), don’t need to involve system call\n三個最常見的API:\nWin32 API for Windows POSIX API for POSIX-based systems (including virtually all versions of UNIX, Linux, and Mac OS X) Java API for the Java virtual machine (JVM) Why use API? 簡單(API是為應用程序而設計的)。 可移植性(API是統一定義的接口)。 效率(並非所有功能都需要OS services或涉及kernel)。 System Calls傳遞參數 System Calls傳遞參數通常使用以下三種方法，在運行程式和作業系統之間傳遞參數。\n在寄存器中傳遞參數。 將參數存儲在memory中的一個table中，table的address作為參數傳遞到一個寄存器中。 程式將參數push(store)入stack ，作業系統將參數pop出stack。 OS Structure 從用戶角度，作業系統應該易於使用和學習，以及可靠、安全和快速。\n從系統角度，作業系統應該易於設計、實施和維護，並且可靠、無錯誤且高效。\n1. Simple OS Architecture 只有一層或兩層代碼，缺點:不安全，難以增強改善。\n2. Layered OS Architecture 下層獨立於上層，第N層只能訪問第0~(N-1)層提供的服務。優點式更容易調試與維護，缺點是效率較低，難以定義層。\n3. Microkernel OS 盡可能多地從kernel移動到userspace像是一個program，通過消息傳遞提供通信，容易擴展和移植。缺點是效能更差，因為所有的動作都要再透過kernel。\n4. Modular OS Structure 大多數現代作業系統都實現了kernel modules，與Microkernel不同之處在於Modular OS全部都在kernel space。\n使用物件導向的方法(object-oriented approach)。 每個核心組件都是獨立的。 每個模組都通過已知接口與其他模組通訊。 每一個模組都可以根據需要在kernel中掛載。 kernel module實作\nhttp://www.linuxchix.org/content/courses/kernel_hacking/lesson8 http://en.wikibooks.org/wiki/The_Linux_Kernel/Modules\nhttps://www.thc.org/papers/LKM_HACKING.html\n5. Virtual Machine 虛擬機採用分層方法得出其邏輯結論，它將hardware和operating system kernel視為硬體。虛擬機提供與底層bare hardware相同的接口，為每個process提供底層計算機的(virtual) copy。\n由於VM是執行在user space，當遇到無效的instruction會透過interrupt去call底層的kernel space執行，而目前有hardware support的硬體是透過加一個bit去判斷kernel mode,user mode,VM mode。\n虛擬機的困難點在於\u0026quot;critical instruction\u0026quot;難以處理。\nVM的用處:\n提供對系統資源的完整保護。 解決系統兼容性問題的手段。 作業系統研究和開發的完美工具。 一種提高雲計算資源利用率的方法。 資安作滲透測試。 Vmware (Full Virtualization) 以user mode運行，作為作業系統之上的應用程序，虛擬機認為它們是在bare hardware上運行，但實際上是在user-level應用程序中運行。\nPara-virtualization: Xen\n向guest提供與guest系統相似但不相同的系統(必須修改guest)，只有一半被虛擬化。在container (zone)processes中認為它們是系統上唯一的進程，Hardware被虛擬化(只安裝一個kernel)。\n6. Java Virtual Machine 已編譯的 Java 程式是由Java Virtual Machine(JVM)執行與平台無關的bytecodes，Just-In-Time(JIT)編譯器可提高性能。\nJVM consists of\nclass loader class verifier runtime interpreter Ch3 Processes Concept Process Concept Process與Program最主要的差異，在於是否處於執行狀態\nProgram (Passive entity) 只是儲存於\u0026quot;disk\u0026quot;中等待被執行的程式碼 Process (Active entity) 則是位於記憶體中的正在被執行的\u0026quot;Program\u0026rdquo; 一個\u0026quot;Process\u0026quot;由以下內容組成： Code segment：也稱text section，將 program (已編譯為instruction) 讀到記憶體中，等待被 CPU fetch 並執行\nData section：global variables\nStack：temporary local variables and functions(方便使用後直接pop掉)\nHeap：dynamic allocated variables or classes\nCurrent Activity：管理 Process 的 Meta data，如Program counter, Register Contents\nA set of associated resources：相關資源的 set，如 Open file handlers (檔案的開啟、或是跟 OS 要某些硬體的控制權)\n1. Threads Threads 又稱為 Lightweight process，是使用 CPU 的最小單位，同 Process 的 Threads 有共享的記憶體空間。在 Parent Process 創造 Threads 時就會 allocate ，因此省去在空間管理及處理上的執行動作。 同Process中，Threads共用以下內容 code section data section OS resources (e.g. open files and signals) 但以下部份各自獨立 stack register set thread ID program counter 2. Process State Process 在其生命週期中，共有 5 個狀態\nNew：當 process 被創建時，將 code 讀到記憶體中，並將前述記憶體狀態初始化 Ready： Process 競爭的資源是 CPU 的核心，管理的方式為佇列 (Queue)，在等待被執行的階段，會被放在佇列當中，此狀態稱為\u0026quot;Ready\u0026quot; Running：被 CPU 排程選到，執行 instructions。OS 為了確保主控權，一段時間就會將 CPU switch 給 scheduler 而\u0026quot;打斷(interrupt)\u0026ldquo;程序 Waiting：有些指令不會直接使用 CPU (如 I/O)，因為不需要 CPU ，又需等待某些指令完成，所以進入 Waiting 狀態，待完成後重新放回 Ready Terminated：Process 完成執行，釋放資源給 OS。 3. Process Control Block (PCB) User 創建 Process 後，OS 會自動建立 PCB 來做管理。 我們說將 Process 放到佇列當中，指得是將 Process 的 pointer 放到佇列中，而非記憶體空間，使用的資料結構為\u0026quot;Linked list\u0026rdquo;。PCB 包含以下內容：\nProcess state Program counter CPU registers 此外還有： CPU scheduling information(e.g. priority) memory management information(e.g. base/limit register):只有 process 在執行時才會把這兩個值從 memory load 進 CPU 的 register。 I/O status/information accounting information\n4. Context Switch CPU 一次只能執行一個 Process，要切換給另一個 Process 時，必須將舊 Process 的資訊 (e.g. PCB) 儲存起來，並載入新 Process 的資訊，這個動作稱為 「Context Switch」。\nCPU 完整切換的流程如下:\n執行 P0 P0 被打斷讓出 CPU ，此時處於 idle 狀態 進行 Context Switch 將 P0 的狀態存於 PCB 並讀取 P1 的 PCB。 完成 Context Switch 執行 P1\nContext switch 的過程中， CPU 沒有執行任何 instrunction，因此 Context Switch 其實是 overhead，浪費 CPU 的資源。但為了 CPU sharing 及 time sharing，Context switch 無法避免地經常發生，所以我們只能盡可能縮短時間：\nmemory speed number of registers：越少則存取的次數降低，但現在的系統中為了更快速的計算，register 數量是變多的 special instructions：合併 load \u0026amp; save PCB 的 instruction，讓 CPU 一次做完 hardware support：multiple sets of registers，一次記住多個 Process 的狀態，可以快速的在 registers 間進行切換，無須透過 memory access Process Scheduling Multiprogramming：多工處理， CPU 可以執行多個 Process，以最大化利用 CPU Time sharing：分時系統，為一種資源的共享方式，系統可以頻繁地進行 Context Switch，讓多個 User 可以同時使用 Program\n由於 Process 共享 CPU，使用的先後順序就是由 scheduler 來決定。 1. Process Scheduling Queues Job queue (New State)： 系統中所有的 Process Ready queue (Ready State)： 在主記憶體中正在及等待執行的 Process Device queue (Wait State)： 等待 I/O 處理的 Process\n會有一個 ready queue for CPU，很多個 I/O 的 waiting queue，看是哪個 device 或 disk，會有自己獨立的 queue，利用 PCB 中的 pointer 串起來 queue 之間的 tail 和 head 都有串起來，比較容易做 reordering，不同的 Scheduling Algorithm，可能會 dynamically 決定 ordering (run time做調整)，需要其他 pointer 串起來，變成雙向或把前、後記起來 ready queue 可能會有 level 1、level 2、level 3，取決於 Scheduling Algorithm 自身管理方式 Ready queue 中的 process 會等待被 load 進 CPU Waiting queue 發生的原因有很多種，OS 會有專門的 queue 去處理這些 event 的發生： I/O request：若自己發出 I/O request，這時候會被放到 I/O queue，等到做完 I/O，會 throw 一個 interrupt 回來，OS就會把它放回 ready queue，e.g. call printf()，會被放到 monitor queue time slice expired：timer的 alarm 被 fire，會從 CPU(running state) 直接回到 ready queue，這是為了確保主控權可以回到OS的手上 fork a child：process 可以自己 create process，在Linux中，create process的動作叫做\u0026quot;fork\u0026quot;有兩種實做方式 可能自己繼續執行讓children等Parent執行完在執行 先讓children先執行，原來的Parent process會被放在waiting queue，等到Children執行完，才可以再回到ready queue執行 wait for an interrupt：e.g. call sleep() 的 system call，call sleep() 的 process 會被放在 waiting queue 裡，等著 interrupt 的發生，才可以回到 ready queue 裡面 2. Schedulers Scheduling 分為 CPU 及 Job Scheduling\nCPU Scheduling : 因為 time sharing 的原因，發生頻率非常高，又稱為 Short-term scheduler。CPU Scheduler 會選擇該被執行的 Process 並 Load 到 CPU 當中，從\u0026quot;Ready State\u0026quot; 轉換成 \u0026ldquo;Run State\u0026rdquo; Job Scheduling : 可能幾秒或幾分鐘才需要scheduling，又稱為 Long-term scheduler，通常是使用者人為觸發，新的程式被執行，產生程序時才需要被排程，從 \u0026ldquo;New State\u0026rdquo; 轉換成 \u0026ldquo;Ready State\u0026rdquo; Medium-term : 跟虛擬記憶體結合產生的一種 scheduler，因為 memory 空間是有限的，有時會將 disk 的空間拿來使用，當 memory 不夠時，就會將部份 Process 從 memory 踢回 disk，這個動作即由 Medium-term scheduler 來處理，由 \u0026ldquo;Ready state\u0026rdquo; 轉換為 \u0026ldquo;Wait state\u0026rdquo; 3. Long-Term Scheduler 控制在記憶體中 Process 的數量 (degree of multi-programming) 當 degree 太低時， CPU 有很多的時間在 idle 當 degree 太高時，會發生 Thrashing，有太多的 Process 在爭搶有限的 memory，導致 Process 一直在 memory 跟 disk 之間 swap，不斷的做 I/O 因我們希望 CPU 跟 I/O 執行的時間差不多，負載盡可能平衡而最大化系統效能，所以 Process 要能夠在 CPU-Bound \u0026amp; I/O-Bound 良好的混合 在 UNIX/NT 系統中，並沒有 Long-Term Scheduler 直接將 Process 放到 short-term scheduler 中 (現今電腦的記憶體空間通常是足夠的) Multipropramming degree 受硬體限制 (e.g. # of terminals) 或著由使用者自己調整 4. Short-Term Scheduler 執行頻率很高，大約 100ms 執行一次 由演算法來縮短每個 Process 的等待時間 因為效率要高，演算法也不能太過複雜，避免 CPU overhead 過高 overhead = (time of pick) / (time of execution + time of pick)\n5. Medium-Term Scheduler 因現代 memory 空間的增長以及虛擬記憶體的觀念引入，過往由 Long-Term Schduler 處理的動作多改由 Medium-Term Schduler 執行\nswap out : 將 Process 由 memory 搬到 disk 中 swap in : 將 Process 由 disk 搬到 memory 中 propose : 改善 Process mix / 減少記憶體中的 Process 數量，降低 degree釋放記憶體空間\nOperations on Processes 回到 programmer 及 user 角度，我們到底如何跟 Process 溝通\n1. Tree of Processes 無論什麼作業系統， Processes 一定可以畫成如下的樹狀結構 每一個 Process 由 unique processor identifier (pid) 識別\n2. Process Creation 資源之間的關聯性可能如下 Process 的 Parent 及 Child 共享資源 Child Process 共享部份 Parent 的資源 Parent 及 Child 完全不分享資訊 兩種可能的執行方式 Parent 及 Children 同時執行 Parent 等到 Children 結束後才執行 兩種可能的記憶體空間 Child 為 Parent 的複製 (執行碼、counter 等與 Parent 完全一樣)，透過 sharing variable 溝通 (address 不同) 將特定的 program 丟進 Child 的 code section，重設 counter，讓 Child 變成完全不同狀態的 Process，透過 message passing 溝通 3. UNIX/Linux Process Creation Reference\nfork system call (Create Process) 創建新的 (child) process 該 process 複製其 parent 的記憶體空間 Child 與 Parent 在 fork 後同時執行 (execution concurrently) Child 在 fork 的回傳值為 0 Parent 在 fork 的回傳值為 Child process 的 PID execlp system call (Reset Process) 先創建 Process 及 OS 要記憶體空間，並註冊新的 PID 將新的 binary file 讀入記憶體，並將內容如變數 (heap、stack)、counter 等全部清空 (reset) ，等於讓新的 Child Process 執行不同的程式 wait system call 因 Child \u0026amp; Parent 在 Unix 中是 concurrent 執行，若要控制執行的順序，必須用 wait system call，強制 parent 直到其中一個 Child 的 process 完成後才執行 Memory space of fork() 舊的實作 Child 為 Parent 的完整複製 新的實作使用 copy-on-wirte 技術，在 Run time 過程中，儲存 Child 的與 Parent 的不同處 (A’s Child 在執行過程中會慢慢增長) 若 call execlp，則會產生完全獨立的 Child Process\n以下為 UNIX/Linux Process Creation 的範例程式碼\n以下範例簡單示意 fork 的特性， Child Process 會保存 fork() 呼叫當下 Parent Process 的狀態。注意如果過程中呼叫 execlp ，則該分支會斷掉，樹不會繼續往下生長\n4. Process Termination 當 Process 執行到最後一個指令或是呼叫 exit()，都會中止程序\n該 Process 所有相關資源，如記憶體空間 (physical, virtual)、I/O buffer、open files 等都會清空並將資源還給 OS Parent 可利用 PID(abort) 來中止特定 Child Process 當 Child 配置太多記憶體 Child Process 執行的任務不再需要 Cascading termination：因為是樹狀結構，所以當 Parent 被中止，則 Child Process 也會被中止，這也是為什麼 \u0026ldquo;ctrl+C\u0026rdquo; 可以強制停止 Process，因為其他程序都是由 console 程序創建，更進階的是呼叫 \u0026ldquo;kill\u0026rdquo;，但需要管理者權限 Interprocess Communication 定義：在多個 Process (或 Threads) 間溝通的機制 目的： 資訊的共享 加快計算速度 (not always true) 便利性 (performs several tasks at one time) modularity (e.g. micro-kernel) Communication Methods\n要做到 IPC 用 memory 分別有幾種方式\nShared memory：共用記憶體空間 需要小心處理 synchronization 利用 memory address 實作，好處就是快 透過 memory 的 address 存取資料 Message passing：透過 memory 的 copy，網路或跨電腦的程式通常都是以這種作法溝通 沒有 conflict 的問題，但若資料小，用這個方法的話可以省去 share memory 的 lock 之類的額外資源消耗，反而會略快（且不用在意 sync 的問題） 使用 send/recv message 以 system call 實作，通常較慢\nSockets 透過 IP \u0026amp; Port 來 identify 使用者，port number 指得就是 Process 藉由未結構化的位元資料來溝通 (unstructed stream of bytes) 會有 client \u0026amp; server server 要先打開 client 才能連 client 進行 connect 之後，就可以盡情 read / write 補充：server 在 accept 之後，會動態開 thread，如此才能一次處理多個 request Remote Procedure Calls (RPC) 可以呼叫其他的 Process 甚至其他電腦的 Process 參數以及回傳值以 message 傳遞 與 socket 不同，傳輸的資料是有 data type 的 Library 通常會有 stubs，在 client 端和 server 端會各有一隻小程式，（server 端的叫 skeleton）會負責 implement 細節 其實通常下面也可能用 socket，只是幫 programmer 包起來而已 parameter mashaling: 把 params 包進 message 且嚴謹的管理。要把兩台電腦串在一起其實有許多細節要處理，RPC 就要負責幫使用者把這些繁瑣的事情解決掉\nIn distributed computing, a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction.\n1. Shared Memory Process 要能夠 …\n創建 shared memory 的區塊 共享的記憶體區塊通常會在創建 shared memory 的 Process 的附近 透過這個 shared memory 溝通的 Processes，要告知 OS 說我要共用這塊記憶體位置 (attach) 資料格式為 bytes，由 process 自行定義， OS 不處理 Processes 不能同時對同一塊記憶體做讀寫的動作 Consumer \u0026amp; Producer Problem 兩個 Process 共用一塊 Buffer 記憶體 Buffer 是大小為 B 的 circular array 因為 Buffer 有空間限制，必須有以下資訊來控制 next free: in first available: out empty: in = out (out 拿光) full: (in + 1) % B = out 這邊為了 sync，避免無法判斷 in = out 時是 empty 還是 full，必須使用 in+1 留一個空格。之後會提到以 locking 的方式使用所有的 Buffer 空間\n2. Message Passing 讓 Process 之間可以溝通且同步 IPC 一般來說 OS 會提供兩種操作：Send/Receive 的方式達到同步化，並在背後做各種 memory copy 的處理 Send(message) Receive(message) Message system : Process 不使用 shared variable 達到溝通的目的 為了 Process 間的溝通 必須建立 communication link 藉由 Send/Receive 交換資訊 實作 communication link 的方式 physical (e.g. shared memory, HW bus or network) logical (e.g. logical properties, programmer 在意的事情) communication 是否有方向性 角色是否相對 Blocking / non-blocking：傳輸行為執行完成才會回傳，或不管對方是否有收到立刻回傳 send by copy or by reference 固定大小 / 可變大小 的 message Direct communication (如打電話)\nProcesses 必須要有對方的名稱 Send(P, message) : 傳輸 message 給 Process P Receive(Q, message) : 從 Process Q 接收 message communication link 的特性 Links 通常為自動建立 links \u0026amp; processes 為一對一的關係 link 可以是單向，但通常是雙向 Direct communicatioｎ　最大的缺點是關係唯一對一，且連線的對象無法變更，除非重新建立，所以比較難以模組化 (modularity) Indirect communication (如寄電子郵件)\nMesssages 由 mailboxes(或稱為 port) 導向及接受 每一個 mailbox 有自己的 ID Processes 若共享 mailbox 則可以互相溝通 Send(A, message)：沒有指定接收者，單純將 message 放到 mailbox A Receive(A, message)：沒有指定傳送者，單純將 message 由 mailbox A 接收 communication link 的特性 Link 必須由 programmer 建立，透過 Process 間共享 mailbox 來溝通 因為沒有指定接收者/傳送者，所以 Link 與 Process 間為 Many-to-Many Link 可以為單向或雙向 Mailbox 可以由 Process 或 OS 擁有，通常處理 message 的是另一隻程式 Mailbox Sharing\n因為可能同時有很多人去讀取 message，但理論上一個 message 應該只能有一個人拿到，有以下幾種解決方法： Link 只允許兩個 Process (一個 send 及一個 receive，等同 direct，最糟的解法) 利用 lock 一次只允許一個 Process 拿取 message 讓 mailbox 自行決定誰來接收。receiver 會先提出要求， mailbox 決定接收者後， sender 會被告知 receiver 是誰，再告知 receiver 來取得 message Synchronization\nMessage passing 可以為 blocking (synchronous）或是 non-blocking (asynchronous) Blocking send: sender 被 blocked 直到 message 被 receiver 或 mailbox 接收才 return Nonblocking send: sender 送出 message 之後繼續執行 Blocking receive: receiver 被 blocked 直到皆收到 message 才 return Nonblocking receive:若 sender 先 call，則 receiver 正常接收 message ; 若 sender 前 call，則 receiver 只會收到之前的值。所以 function call 通常還會 return 一個 token ，來確定是否真的收到 message Buffer implementation : non-blocking 通常透過 buffer 實作，只要 buffer 空間沒有滿，就可以一直 send ; 對 receiver 來說就是一直接收，不管 buffer 有沒有東西 Zero capacity ： 通常是 blocking send/receive Bounded capacity ： 若 buffer 滿了， sender 會被 blocked，或是 return 一個 error Unbounded capacity ： 一直送直到系統滿了為止 3. Socket socket只負責建立channel，passing由programmer負責。\nserver端先開一個socket， bind到一個port，OS才知道哪個人要用這個port做溝通 server要先listen，等人進來 client 開socket，然後connect過去server server等到有人就accept，建立兩邊通訊 建立起來就可以read，write 結束後兩端可以選擇close，server close後就沒人可以連進去\n大部分web server或是socket programming，都是設計可以讓許多人連線，如果server是single thread，就只能handle一個user，所以實際上accept後，server side會去creat一個thread(動態建立)。\n4. Remote Procedure Calls socket只能傳bytes，RDC能夠傳struct，類似透過網路remote的functon call。 RDC有stubs在client與server運行，幫忙處理parmeter，把東西package跟unpackage，底層再透過socket傳輸。\nRDC可以跨電腦(eg.big/small endian的問題，32跟64位元int定義長度不同)，marshaling需要處理不同平台的問題；如果要pass pointer大部分的RDC是不支援的，因為pointer指向可能會用到的memory都要copy。\nCh8 Memory Management Background 主記憶體和暫存器為唯二 CPU 可以直接存取資料的地方 Processes 在硬碟中等待被讀入記憶體中及被執行 多個 program 被讀入記憶體中可以改進資源使用率以及反應時間 Process 在執行期間有可能在硬碟及記憶體之間移動\nHow to refer memory in a program? – Address Binding Compile Time\n程式中的資料、參數等必須要有對應的記憶體位置，早期的作法是在編譯期間，就決定要放在哪裡，送進 CPU 時 CPU 就知道該去哪裡存取資料\nCompiler 會將組合語言轉換成實際的記憶體位置(absolute code) 若起始地址變更(可能該地址被其他 process 占住)，則需要重新編譯 (recompile)，等於要關閉並重新執行 ex: MS-DOS .COM format\nLoad Time\nCompiler 不會決定實際的記憶體地址，而是會留一個變數(Base Register)，給出相對位置。程式讀取後(loader，loader 一般假設程式是重新執行，因此會執行非常多動作，如 process 的 control block、記憶體初始化、data structure 的創建等，也就是 program 變成 process 的過程)，才透過該變數決定真正的地址(relocatable code) 若 run time 起始地址變更，則需要重新讀取 (reload)\nExecution Time\nCompiler 將組合語言轉換成 logical-address(i.e. virtual-address) 雖然看似 compile time 決定實際地址，但這其實是個虛擬的地址。 CPU 以為記憶體地址就是 compiler 轉換的位置，但送要求去記憶體存取資料時，中間還有一個硬體單元 MMU(i.e. Memory-Management-Unit, MMU)，會做記憶體地址的轉換，導向正確的實際地址 MMU 將虛擬地址 map 為實際地址 由 logical-address 加上 relocation register 產生實際地址\nMMU 可以看成 OS 的一部分，但因為使用頻率非常高，所以一般用硬體來實作 多數 general-purpose 的作業系統使用這個方法 Logical vs. Physical Address\nLogical address 為 CPU 送出的地址，也就是 virtual address Physical address 為記憶體看到的真實地址 Compile time \u0026amp; Load time address binding 的方式，logical address = physical address Execution-time address binding 的方式，logical address != physical User program(Programming, Compiling…etc) 只管 \u0026ldquo;logical\u0026rdquo; address，永遠不會看到 \u0026ldquo;physical\u0026rdquo; address How to load a program into memory? – static/dynamic loading and linking Dynamica Loading 不會將整個程式 load 到記憶體，子程式在 function call 的時候才 load 這樣做有更好的記憶體空間使用 未用到 routine 不會被載入記憶體 在大量程式碼使用率較低時(如 error handling code)特別有用 OS 提供功能，但不會決定 routine 是 dynamic 或 static loading，而是由使用者決定(library, API) 在 C 語言中使用 Dynamic Loading 的範例，當呼叫 printf(\u0026quot;%f\\n\u0026quot;, (*cosine)(2.0))時，cosine才會讀到記憶體中。現在 programmer 使用 Dynamic Loading 常常是希望在 run time 決定該使用哪個函式。 Static Linking 函式庫透過 loader 被結合進 program 的 image 當中，compile 的時候，將函式庫加入程式碼 每一個用到函式庫的 program 都有一份，浪費記憶體資源，但執行比較快 即便改用 Static Linking 加上 Dynamic Loading，因為函式庫仍然需要，因此無法解決程式碼重複複製的問題\nDynamic Linking Dynamic Linking 在 run time 才去找連結 因此只需要一份 library 在記憶體當中 OS 在 program 中加入 stub，call stub 的時候會向 OS 確認 library 是否在記憶體中 stub call \u0026ndash;\u0026gt; 找 referred lib 是否在 memory 中，沒有的話則 Load 進來 \u0026ndash;\u0026gt; 將其位址替換掉，之後就不用經過 stub(relocation) 因為在 run time 時期才找函式庫，執行速度較慢 在 windows 中為了系統效能，是編譯成 DLL(Dynamic link library)\nHow to move a program between mem. \u0026amp; disk? – Swap Process 可以從記憶體中 swap 到 backing store，稍後再 swap 回記憶體中執行 virtual memory 及 mid-term scheduler 使用 backing store 是與檔案系統(file system)分離的一塊硬碟空間，透過 OS 的 MMU 直接管理 為何需要 Swap 釋放 memory space 讓重要性較低的 process roll out，roll in 重要性較高的 process swap back memory location 若 binding address 是在編譯或 load 時期決定，則 swap 回去的記憶體位置要相同 若 binding address 是在 run time 動態決定，則 swap 回去的記憶體位置可以不同 程序被 swap 前， OS 會確認是否是閒置的(idle)，除 CPU 執行外，也不能執行 I/O 若想 swap 在 I/O pending 的 process，有以下解法： 乾脆不要 swap 的 I/O pending 的 process 做完的 I/O 先copy 資料到 OS buffers(memory space 不屬於任何 user process)，就能把 process swap 出去，swap 回來時，只要 OS buffer 中的資料複製到 process 的 buffer 即可 swap 主要時間花在資料的傳輸，transfer time 與資料傳輸的大小成正比，該如何決定被 swap 的 process 非常重要，詳見 CH9 - virtual memory Contiguous Memory Allocation 相關資料 CS:APP Malloc Lab 解題筆記\nMemory Allocation Fixed-partition allocation: 每個 process 讀進一個 fixed-size 的 partition Multi-programming 的程度由 partition 的數量決定 Variable-size partition (Multiple Partition) Hole 定義為一塊連續的記憶體位置 不同大小的 Holes 散布在記憶體當中 當有 process 抵達，會被 allocate 在一個夠大的 hole 裡頭 OS 會理 in-use 及 free 的 hole 的資訊 一個被釋放的 hole 能夠跟其他 hole 合併成一個更大的 hole\nDynamic Storage Allocation Problem 問題：如何從一串 free holes 中找出符合大小 n 要求的 hole 解法： First fit - 1st 符合的 hole 就直接配置 Best fit - 配置大小最剛好的 hole 可能要搜尋整個 hole list Worst fit - 配置最大的 hole 可能要搜尋整個 hole list First fit and Best fit 無論在速度或空間使用上都比 Worst fit 好 Fragmentation External fragmentation (frag space 在 process 外) 全部的 free memory space 是足夠滿足需求的，但卻不是連續的 發生在 variable-size allocation 解法： Compaction 將記憶體空間做 shuffle，在 execution time 讓 free memory 結合成一整塊 只有 binding address 在 run time 決定才能使用\nNon-Contiguous Memory Allocation — Paging 相關資料 MIT6.s081 Lab: page tables\nPaging Concept Method: 將 physical memory 切成 fixed-sized blocks 稱為 frames 將 logical address space 切成一樣大小的 blocks 稱為 pages 為了要 run 一個有 n pages 的 program，需要找 n 個 free frames 並載入 program OS 會持續追蹤 free frames，以 page table 建立 logical to physical address 的轉換關係 Benefit: 允許 process 的 physical-address space 可以是不連續的 避免 external fragmentation 盡可能降低 internal fragmentation 提供 shared memory/pages Page Table 每一個 entry 對應到在 physical memory 中的 page 的 base address 每一個 process 有一個 page table，由 OS 直接進行管理 Page table 只包含 process 擁有的 pages process 無法存取不是其 space 的記憶體地址\nAddress Translation Scheme Logical address 分成兩部份 Page number ( p ) 為 page table 的 key 值，對應 value 為 page 在 physical memory 的 base address N bits 代表一個 process 最多可配置 2N 個 pages 的記憶體，限制住 programm 可 allocate 的大小 (例如 32-bits 的電腦，一個 program 最多 allocate 4GB 左右的空間) Page offset ( d ) 與 base address 結合定義 physical memory address N bits 代表 page size 為 2N 由 page number 找出放在第幾個 page，再加上 page offset 得到實際的記憶體位置 physical address = page base address + page offset 如果 page size 為 1kb(2^10) 且 page 2 map 到 frame 5 若 logical address 為 13 bits (p=2, d=20)，則 physical address 為？ 5 * 1kB + 20 = 1,010,000,000,000 + 0,000,010,100 = 1,010,000,010,100\npages 的總數量不一定和 frames 的總數量相同 pages 的總數量決定 process 的 logical memory size frames 的總數量則與 physical memory 大小有關 例如： 給定一個 32-bits 的 logical address，36 bits 的 physical address 以及 4KB 的 page size，這代表？ page table size = 2^32 / 2^12 = 2^20 個 entries Max program memory: 2^32 = 4GB Total physical memory size = 2^36 = 64GB Number of bits for page number = 2^20 pages -\u0026gt; 20 bits Number of bits for frame number = 2^24 frames -\u0026gt; 24 bits Number of bits for page offset = 4KB page size = 2^12 bytes -\u0026gt; 12 bits Free Frames OS 用 free frame list 記下所有 free 的 frame\nPage/Frame Size page \u0026amp; frame size 由 hardware 定義 通常是 2 的冪次 通常從 512 bytes 到 16 MB/page 最常見的是 4KB/8KB(32bit -\u0026gt; 4KB；64bit -\u0026gt; 8KB) Internal fragmentation? Larger page size -\u0026gt; 更多空間的浪費 但因為以下原因， page sizes 有變大的趨勢 記憶體、process、data sets 變得更大， process 變大代表要 access 的 page 也越多，若 page size 太小一來找尋的次數增加，二來因為 page 太多很可能部份的 page 放在 disk 中，降低執行及讀取速度 更好的 I/O performance(during page fault) page table 可以比較小 Page Summary 使用者看到的是連續性的記憶體，但實際上是分散的 OS 為每個 process 維持一個 page table OS 維持 frame table 管理 physical memory 每個 frame 有自己的 entry 表示 frame 是 free 還是 allocated entry 記 \u0026quot; process id \u0026quot; 和 \u0026quot; page number \u0026quot; Implementation of Page Table Page table 保存在記憶體中 因為做 translate 的為 MMU，而 MMU 是硬體單元，所以 Page table 在記憶體中的位置會存在 Page-table base register (PTBR) 記憶 Page table 在記憶體的位置 PTBR value 存在 Process Control Block 裡頭(PCB) 在 Context switch 時更新 PTBR value (除了 CPU 的 register，MMU 的 register 也要重新 load) 每一次讀取記憶體實際上動作有兩步 第一步先找到 Page Table，mapping 後才到真實的記憶體地址存取資料 兩步讀取的動作可以由 Translation Look-aside Buffers (TLB) 解決，簡單來說是一個 cache，若 cache hit，則可以縮短為 1 步，以 Asscociative Memory 實作 Asscociative Memory Associative Memory 為硬體，所有的 memory entires 可以同時被讀取 (查詢為 O(1)) 每一個 entry 對應一個 associative register 但 entries 的數量是有限制的，一般來說是 64~1024 左右\nTranslation Look-aside Buffer (TLB) 由 Associative Memory 組成，是硬體單元 page table 的快取被所有的 process 共享 Context switch 後，因為 process 不同，page table 也不同，一般會 flush 整個 TLB; 另一個解法是在 TLB entry 增加 PID 的欄位，同時符合 page number 及 PID 才叫做 hit (address-space identifiers(ASIDs)) 因為 context switch 後 TLB 被清空，等於剛開始記憶體地址都要兩步才能取得，是 context switch 拖慢效能的主要原因\nEffective Memory-Access Time 20ns for TLB search 100 ns for memory access Effective Memory-Access Time (EMAT) 假設 70% TLB hit-ratio: EMAT = 0.7x(20+100) + (1-0.7)x(20+100+100) = 150 ns 假設 98% TLB hit-ratio: EMAT = 0.98x120 + 0.02x220 = 122 ns Memory Protection page table 中，每一個 page 都有 protection bit ，表示 “唯讀” 或 “可讀寫” valid-invalid bit Valid: page/frame 在 process 的 logical address space，process 可以讀取 Invalid: page/frame 不在 process 的 logical address space ，禁止 process 存取 早期會先創建固定大小的 page table，因為 program 會長，有可能目前 page 的數量少於 page table 的大小，若此時有 pointer 不小心指到該處，就會報 segmentation fault 缺點是可能很多 entry 沒有用到 -\u0026gt; 使用 page table length register (PTLR)，動態變更 page table 的大小。 program 配置記憶體以 byte 為單位，而 valid-invalid bit 以 page 為單位，因此需要 memory limit register 紀錄 program 真正使用的記憶體空間，限制無效的存取\nShared Pages 允許 page 在不同 processes 間共享相同的 Reentrant code(read only) Reentrant code (Pure code) 在執行期間不會改變 如 text editors, compilers, web servers, etc 在 physical memory 中只需要保存一份 shared code Process 保有自己的 private data 以及 code 數個 virtual address map 到相同的 physical address\nPage Table Memory Structure Page table 有可能很大而且難以存取 4GB (2^32) logical address space with 4KB (2^12) page 要有 1 million(2^20) page table entry 若一個 entry 4 bytes，則 page table 要 4MB，又因為 page table　是給 MMU 讀取的，MMU 沒有 address translation，所以這 4MB 的空間必須連續，但 physical address 通常很難找到 4MB 的連續空間 需要將 page table 切分成數個較小的 page tables，最好在一個 page size 大小(4KB) 的範圍內 或著將 page table 的總大小限縮 解法： Hierarchical Paging Hash Page Tables Inverted Page Table Hierarchical Paging 將 page table 拆成數個較小的 table，將 logical address space 化成多層 page tables (n-level page table)，但因為多層的結構，實際上總 entry 是增加的。ex: A[1000] -\u0026gt; A[10][100] -\u0026gt; A[10][10][10]\n64-bit Address 如果切成 42(p1) + 10(p2) + 12(offset) outer table 需要 2^42 X 4B = 16TB 的連續記憶體!! 如果切成 12(p1) + 10(p2) + 10(p3) + 10(p4) + 10(p5) + 12(offset) outer table 需要 2^12 X 4B = 16KB 的連續記憶體 但記憶體存取次數變成 6 倍 Hashed Page Table 通常用在 address \u0026gt; 32 bits Virtual page number 會被 hash 進 hash table Hash table 的大小影響 bucket 的 chain 的長度 每一個 hash table 的 entry 包含以下資訊 Virtual Page Number, Frame Number, Next Pointer 不過 pointer 的結構會浪費額外記憶體。另外，linked-list 搜尋時間為 O(N)\n一個改善的實作是將 linked-list 的 element 設為 array，降低 linked-list traverse 的次數\nInverted Page Table 不使用 page table，而是改用 frame table， entry 為 PID + Page Number 若使用 page table，當 process 數量越來越多， page table 的數量跟著增加 frame table 只需要一個，可以事先配置，且使用率接近 100%，減少儲存 table 的記憶體需求 但存取時要搜尋整個 table，增加存取的時間 最麻煩的是難以實作 page 的 sharing，所以這種作法比較少見\nNon-Contiguous Memory Allocation — Segmentation Segmentation 以使用者的角度來決定如何切割記憶體 一個 program 可以看成 segments 的集合，segment 是一個 logic unit，可能包含： main program function, object local/global variables stack, symbol table arrays, etc…\nSegmentation Table Logical address:(seg#, offset) Offset 可以描述的長度不受 program 長度限制，只受限於系統定義 program 最多可配置多少記憶體有關 Segmentation table - map 二維的 physical address，每一個 entry 有 Base(4 bytes): physical address 的起始位置 Limit(4 bytes): segment 的長度 Segment-table base register (STBR)：儲存 table 的 physical addr. Segment-table length register (STLR): 儲存 segment 的數量 Segmentation Hardware limit register 檢查 offset 有沒有超過範圍 MMU 指派一個合適的 base address 給 segment 以配置 memory segment 之間的 physical address 不能重疊 s 為 table 的 index， d 是 offset，若 offset 超過 limit，就發生 segmentation fault; 若符合條件，與 page table 不同， physical address 為 base + offset 直接相加沒有單位(page) 的概念 每一個 segment 的 control 是獨立的，如 heap, stack 允許的空間可能不同\nAddress Translation Comparison Segment Table entry: segment base address, limit Segment base address 可以為任意值 Offset 的最大值等同於 physical memory size Page Table entry: frame base address Frame base address = frame number * page size Offset 的最大值等同於 page size Example of Segmentation Sharing of Segments Protection \u0026amp; Sharing Segments 的 protection bits Read only segment (code) Read-write segments (data, heap, stack) Code sharing 發生在 segment level Shared memory communication Shared library 不同的 segment tables 有相同的 base address 就共享 segment Segmentation with Paging 基本概念 在 logical address space 使用 segmentation，映射到 pages 時再切，compiler 不用管 physical address 怎麼對應 在 physical address space 使用 paging，藉由 MMU 做地址的映射，提高記憶體使用的效率\nAddress Translation CPU 產生 logical address 交給 segmentation unit 後產生 linear address Linear address 交給 page unit 產生 physical memory address Segmentation \u0026amp; pageing units 都由 MMU 處理\nExample: Intel Pentium Logical-address space 分成兩部份 1st: 8K(2^13) segments(private), local descriptor table 2st: 8K(2^13) segments (shared), global descriptor table private \u0026amp; share 會是兩個分開的 segment Logical address 一個 process 其 segments 的數量為 2^14 = 16K segment 的大小 \u0026lt;= 2^32 = 4GB\nSegmentation Segment descriptor Segment base address \u0026amp; length 存取權利及優先級\nPaging (2 Level) Page size 可以是 4KB 或 4MB 將 32 bits 切成 page directory(outer page table), page tables(inner page table) \u0026amp; offset 每一個 page directory entry 有 indication 用的 flag，代表使用 4KB 或是 4MB 的 page，系統會動態決定，若是 4MB 則 32 bits 只切兩份，後面的 bits 都給 offset\n範例題目 physical mem size = 512B 代表 seg offset 為 9 bits page size = 32 B 代表 page offest 為 5 bits 8 個 segments linear address 前 3 bits 是 segment table 的 index 現有 12 bits 的 logical address = 448 -\u0026gt; 010|001001000 segment index = 010 = 2 對應到 001110110 加上 segment offset 001110110 + 001001000 = 0101|11110 因為 page offset 為 5 bits，所以 page table index = 0101 = 5 對應到 physical frame number = 2 所以最終結果為 0010|11110\nCh9 Virtual Memory Management Background 為何我們不希望執行 program 時，將所有內容放進 memory 中 有許多程式碼負責不常使用的 erros 或 conditions 部份 program routine 不常使用 很多 program 使用相同的 libary 已經配置但沒有被使用的 Arrays, lists \u0026amp; tables 我們希望更好的 memory 使用率，真的需要使用的才放入 memory 中 Virtual memory: 將 user logical memory 從 physical memory 分離 因為 logical -\u0026gt; physical 只是 mapping 的問題，所以 logical memory 可以比 physical memory 來的大，可以執行非常大的 process 提高 CPU/resources 的使用率，越多 process 在 virtual memory 中，degree 越高，就越容易找到需要某個資源的 process 去使用 簡化 compiling 的工作，不需要管 memory 的限制 提昇 programs 的執行速度，因為不用將整個 program 讀進 memory，有較低的 I/O load \u0026amp; swap 的負載 Virtual memory 可以透過以下兩種方式實作 Demand paging，因為是 fix-size，對硬體使用來說資源分配比較容易管理 Demand segmentation -\u0026gt; 因 segmentation 大小不固定，要找到空間的複雜度較高，效率較低，但對 user 來說比較容易理解及使用 (heap, stack…etc) Virtual Memory vs. Physical Memory\nDemand Paging Demand Paging 當 Page 被需要時才讀進 memory 中，好處是 較少的 I/O 需求 \u0026ndash;\u0026gt; 更快的響應 較少的 memory 需求 \u0026ndash;\u0026gt; 可以有更多 programs 執行 當 Page 有 reference 指向它時，代表 Page 被需要 若 reference invalid \u0026ndash;\u0026gt; abort (沒有 allocate) Not-in-memory \u0026ndash;\u0026gt; 利用 paging 讀入記憶體 (page fault) pure demand paging process 啟動時完全沒有 page 只有當 page 需要時才讀進 memory swapper (midterm scheduler) 管理整個 process ，而 pager 則是管理 process 的一個 page 為單位 硬體支援 Page Table: valid-invalid bit 來表示 page 是否在記憶體中 1 -\u0026gt; page in memory 0 -\u0026gt; page not in memory 一開始該 bits 都設成 0 Secondary memory (swap space, backing store): page 從 memory 被 swap 出去的儲存空間，通常是 high-speed disk Page Fault 相關資料:MIT6.s081 Lab: xv6 lazy page allocation\n第一次的 reference 會引發 trap to OS 稱為 page fault trap OS 會查看在 PCB 裡頭的 internal table ，確認是 Invalid 或只是 not in memory，決定後續動作 找到一個 empty frame (可以置放 page 的空間) 將 page 從 disk (swap space) 移到 frame 設定 Page-table，將 valid-invalid bit 設為 1 重啟 instruction\nPage Replacement 若 page fault 時沒有 free frame 的話 Swap 一個 frame 回 backing store Swap 目標 page 進 frame Demand Paging Performance Effective Access Time (EAT): (1 – p) * ma + p * pft p 為 page fault rate, ma 為 mem. access time, pft 為 page fault time mem. access time 包含找到位置及將資料從 memory chip 搬到 CPU register 的時間 page fault time 則多了資料在記憶體 - disk 之間 swap 的時間 pft 遠大於 ma，EAT 基本上由 pft 及 page fault rate 決定 假設 ma = 200 ns, pft = 8 ms，若 1000 次產生 1 次 page fault，則速度就會慢上 40 倍 ; 換個角度如果我們希望 page fault 對讀取時間的影響小於 10%，則 page fault rate 必須小於 0.0000025 Programs 的 refernce 通常是 locality 的，代表 program 通常會存取在鄰近位置的 memory address 一個 page fault 可以讀取 4KB 的資料進來 大幅降低 page fault 發生的機率 Page fault time 的時間組成 page-fault 中斷 將 page 從 disk 中讀進 memory (最花時間) 重啟 process Process Creation Process \u0026amp; Virtual Memory Demand Paging: 當有需要時才 swap page 進 memory Copy-on-Write: parent 跟 child processes 一開始共享 frames，當有內容發生不同時，才會 copy frame Memory-Mapped File: 將 file 的 disk content 當作 memory content，用 virtual address space 做 mapping，避開 file system，增加 I/O 效能。通常適用於大檔案，因為 paging 需要 4KB 的空間，小檔案使用會有記憶體空間碎片化的問題 Copy-on-Write 相關資料:MIT6.s081 Lab: Copy-on-Write Fork for xv6\n允許 parent \u0026amp; child 共享 frames 若其中一者變更 frame，則僅對該 frame 進行 copy 的動作 COW 使得 process creation 有效率(e.g. fork()) 通常 free frame 時會完全清空，避免前一個 process 使用的一些 content 被其他 process 看見，造成潛在的安全性問題 When a child process is forked\nAfter a page is modified\nMemory-Mapped Files 方法： MMF 透過 disk block to memory frame 的 mapping，讓 I/O 像一般的記憶體存取，略過 file system calls (eg. read(), write()) file 一開始使用 demand paging 讀取，之後的讀寫動作視作一般的 memory access 好處： 略過 file system calls (如 read(), write()) 允許多個 processes 共享 file 的內容 壞處： 安全性、資料遺失、更多的 programming efforts\n範例：\nPage Replacement Page Replacement 的演算法會嚴重影響系統的速度，假設演算法經常將需要用到的 pages swap 去 disk，則 pages 在 memory 跟 disk 一直來回的時間會大幅拖慢系統的效能\nPage Replacement Concept 當沒有 free frame 時發生 page fault 將整個 process swap 掉，釋放所有 process 佔有的 free frames，但這樣 process 就完全不能使用，並不是一個好方法 採用 page replacement ，找到一個目前沒有被使用的 frame 將其 free 掉 使用 dirty bit 表示 page 的內容是否被修改過，若 page 沒有被修改過，就直接 free 掉 frame 的內容; 有修改過才將資料寫回 disk ，來減少 page transfers 的 overhead， replacement 必須要處理兩個問題 free-allocation algorithm: 演算法必須決定多少 frames 應該 allocate 給 process page-replacement algorithm: 選擇哪些 frames 被取代 Page Replacement Step 在 disk 中找到需要的 page 若有 free frame，則直接使用; 若沒有 free frame 則執行 page replacement 演算法來選擇被取代的 frame 將需求的 page 讀進 free frame 中，並更新 page \u0026amp; frame tables 重啟 process 的指令 Page Replacement Algorithms 目標：最低的 page-fault rate 評估：一連串的 page id (reference string, memory refernces) 為輸入，計算 page fault 發生的次數 FIFO algorithm 在佇列中最舊的 page 會被取代 範例： 假設 available memory frames = 3 產生 9 次 page fault\nBelady’s Anomaly: 即便增加 frames 的數量，page fault 的數量不一定會減少，還有可能會增加 假設 available memory frames = 4 產生 10 次 page fault\n因為 Belady’s Anomaly，使得我們很難對系統進行調整，例如插越多條記憶體，反而執行速度有機會變慢 Optimal (Belady) Algorithm 取代未來最長時間不會被使用的 page 但實際上我們不會有未來的資訊 因此這個演算法比較類似提供我們一個基準\nLRU Algorithm (Least Recently Used) 一種 optimal algorithm 的近似 因為無法預測未來，所以我們往回看 取代最長時間沒有被使用的 page 因為 locality 及時間複雜度低(O(1))的緣故，LRU 很常被使用 Counter implementation 紀錄每個 page 最近被使用的 time-stamp 取代 time-stamp 最舊的 page 時間複雜度 O(N) Stack implementation (實際使用) 當 page 被使用時，將 page 移到 double-linked list 最前方 可以用 hash map 紀錄 double-linked list 每個 element 的指標，達成 O(1) 的實作 取代 linked list 中位在 tail 的 page\nStack Algorithm Optimal \u0026amp; LRU 都是 stack algorithm，有以下這些特性\nn frames 的 pages 一定是 n+1 frames pages 的 subset，也就是說因為 stack 的特性，先被放入的元素一定會先被看到，若增加 frames，也只是在原 stack 後面增加一些 pages 而已 Stack algorithm 不會有 Belady’s anomaly 問題 LRU 近似的演算法 additional-reference-bits algorithm second-chance algorithm：2 個 LRU stack enhanced second-chance algorithm Counting Algorithms LFU Algorithm (least frequently used) 每一個 page 有 counter 經常被使用的 page 應該要有大的 count value MFU Algorithm (most frequently used) 不過常用不代表正在用，有可能在某些時刻集中使用，將 count 拉高，但多數時間沒有使用 最小的 count 有可能是剛帶進來的，還沒被使用，所以應該留著 兩者都不常用 要一直執行加法成本很高 有 overflow 的問題 表現不一定較佳 Allocation of frames 每個 process 最少都需要一定數量的 frames\nFrame Allocation Fixed allocation: 根據 process 在一開始就決定要 allocate 多少 frame Equal allocation: 每個 process 配置到的 frames 數目相同 Proportional allocation: 根據 process 的大小來配置 Priority allocation 在 run time 的時候，根據 process 的優先度決定配置 如果 process 發生 page fault 選擇 process 本身的一個 frame 來替代 或著選擇低優先度的 process 的 frame 來替代 Local allocation: 只能替換自己的 frames，通常跟 fixed allocation 綁在一起 Global allocation: 從所有的 frames 中選擇一個來替代 可以拿其他 process 的 frame 例如讓高優先度的 process 搶低優先度的 process 有好的系統表現，所以較常使用 會有一個問題是如果一直搶低優先度 process 的 frame，有可能該 process 甚至無法維持最低的 frames 數量，所以要有機制來維持最低 frames，避免 process 被 thrashing Thrashing 如果一個 process 沒有足夠的 frames，代表 process 在記憶體中的 frames 數量不足以支撐 process 執行，導致 page fault 一直在發生 (且 page fault 是 instruction level，無法 overlap)，等於 CPU 要一直等待 I/O，造成 CPU 使用率反而下降的情況\nThrashing 的定義為： 當一個 process 花在 paging 的時間比執行時間更高時，稱為 thrashing\nThrashing 造成的 performance 問題 processes 因 page fault 在等待 I/O 因此 CPU 使用率下降 OS 發現 CPU 使用率下降，增加 degree of multiprogramming 新產生的 processes 從舊的 processes 搶 frames，導致更多的 page fault 結果 CPU 的使用率繼續下降 為了避免 Thrashing，必須要控制 degree of multiprogramming Working-Set Model 從 Locality 的角度思考，對一個 process 而言，我們可以計算在這段時間內使用多少 pages，這個數量就是要 assign 給 process 的 frames 數量 因為 process 的需求是動態變化的，所以 locality 會隨時間改變，OS 必須要持續追蹤 processes 的 locality 例如 program structure (如 subroutine, loop, stack) 或 data structure (array, table…etc) Working-set Model Working-set window: 觀察的一段時間 Working set: 這一段時間內，被 process reference 到的 page 數\n每一個 process 的 working set size $WSS_i$ frames 的總需求數 $D=∑WSS_i$ 如果 D \u0026gt; m (available frames) ，則有 thrashing 發生 OS 會監控每個 process 的 $WSS_i$ ，並配置足夠的 frames 給每個 process 如果 D \u0026laquo; m，增加 degree of multiprogramming 如果 D \u0026gt; m，把整個 process suspend (mid-term scheduler) 掉，free 該 process 所有的 frames 優點 在最大化 multiprogramming 的情況下，同時防止 trashing 的發生 可以最大化 CPU 使用率 缺點 tracking 的成本很高 Page Fault Frequency Scheme 監控每個 process 發生 page fault 的機率，控制 page fault rate 在一定範圍內來防止 thrashing 的現象 依據 page fault rate 為每一個 process 建立 upper 跟 lower bounds 如果 page fault rate 超過 upper limit，則配置更多的 frames 如果 page fault rate 低於 lower limit，則移除部份的 frames\nWorking Sets and Page Fault Rates 重點是 memory 的 locality 會變化，所以需要追蹤 process 的使用情況，動態地調整 processes 及 frames 的配置情況\nCh4 Multithreaded Programming Threads Threads 又稱為 Lightweight process，是使用 CPU 的最小單位，同 Process 的 Threads 有共享的記憶體空間。在 Parent Process 創造 Threads 時就會 allocate ，因此省去在空間管理及處理上的執行動作。\n同 Process 中，Threads 共用以下內容 code section data section (global variable, heap) OS resources (e.g. open files and signals) 但以下部份各自獨立 stack register set \u0026ndash;\u0026gt;可能 instruction 的執行位置不同，甚至執行不同的 function call thread ID program counter\nMotivation web browser 如一個 thread 負責顯示文字，其他 thread 接收資料等 web server One request / process: poor performance One request / thread: 因為 code 及 data sharing，效率較高 會有一個 main thread 一直在等待，當接收到新 request 時，會產生一個 thread 專門處理，讓 main thread 可以繼續等待連接 RPC server One RPC request / thread\nBenefits of Multithreading Responsiveness : 即使 program 的一部分被 block 住，或是執行冗長的操作，仍可繼續運行，加速響應時間 Resource sharing : 不同的 threads 可利用相同的記憶體位置來共享資源 Utilization of MP arch : 因為現在都是多核心，因此 thread 可以在不同 processors 上平行執行 Economy : thread 無須記憶體空間管理及處理，建立 Thread的 cost 比 process 來得小。而且因為 thread 共用 process 資源，thread 之間的 context switch 也比 process 來得快。 Multithreaded programming 提供一種更有效率使用多核心的機制，改善共時性 (concurrency) 多核心系統使 system designer 以及 application programmer 面對更多挑戰 對 OS 設計者 : 如何設計 scheduling algorithms 讓多核心可以平行執行\nChallenges in Multicore Programming Dividing activities : 將 program 拆成多個可以同時處理的任務 Data splitting : 除了計算任務要拆，資料也要能夠拆開給不同任務處理。有時候 data 很複雜，不一定是平分給所有任務處理 Data dependency : shared data 的同步，是平行程式中最複雜且重要的部份 Balance : 各個任務的執行時間要差不多，否則會受限於執行最久的任務 Testing and debugging 非常困難 User vs. Kernel Threads User threads : 由 user 透過 threads library 進行的 thread 控制。雖然由 user 創建，但實際 thread 要執行任務時， OS 會將該 thread binding 到某一個 kernel thread 上，每次可對應到不同的 kernel thread。 POSIX Pthreads Win32 threads Java threads 所謂 user thread 就是 thread library，更重要的是 user level 的 thread，不由 kernel 直接控制，通常在創建及管理上會比較快 但如果 kernel thread 只有一個的話，即便有多個 user threads，因為有 binding 的關係，只要某個 user thread 執行時呼叫 I/O 或 sleep()，則其他 threads 就沒辦法再使用該 kernel thread Kernel threads : 由 kernel(OS) 直接控制 Windows 2000(NT) Solaris Linux Tru64 UNIX 由 kernel 進行創建及管理，速度較慢 若某個 thread 被 block，仍可由 kernel 安排其他 threads 執行工作 Multithreading Models Kernel mapping threads 的方式通常有以下幾種：\nMany-to-One 許多 user thread mapping 到一個 kernel thread 在不支援多 trheads 的 kernel 使用 Thread 管理在 user space 完成，效率高 但整個 process 可能被 block 一次只有一個 thread 可以 access kernel，多執行緒在多處理器的環境下也無法平行化\nOne-to-One Windows XP/NT/2000 Linux Solaris 9 and later 每個 user thread mapping 到一個 kernel thread 因為 kernel thread 數量通常受到限制，所以 user thread More concurrency 因為創建一個 user thread 必須同時創建一個對應的 kernel thread，所以有較高的 overhead\nMany-to-Many 多個 user threads 對應到相同或較少數量的 kernel threads，而且是在 runtime 期間做 mapping user threads 數量不受限制 kernel threads 可以在多核心系統中平行執行 當某個 thread 被 block 時，可安排其他 kernel thread 來執行\nShared-Memory Programming 定義：Processes 透過 shared memory space 進行溝通及協作 比 messgae passing 更快也更有效率\n有許多議題需要處理： Synchronization deadlock Cache coherence Programming 的技巧 Parallelizing compiler Unix Processes Threads (Pthreads, Java) What is Pthread POSIX (Portable Operating System Interface，只定義行為不定義實作，也就是 API 層面必須一模一樣) 標準針對 Unix 類的不同系統 (MacOs, Linux…等)，程式碼只需要重新編譯而不用修改即可執行 Message passing 的 library MPI 也有相同概念 Pthread 即是定義在 POSIX 標準下的 thread 庫 Pthread Creation\npthread_create(thread, attr, routine, arg) 有時我們會指定某個 thread 榜在某個指定的 core 上，因為不同 core 的 L1 cache 不共享，這個行為可以透過 attr 參數來控制\nPthread Joining \u0026amp; Detaching\npthread_join(threadId, status) Block 直到特定 threadId 的 thread 結束 達成 threads 之間同步化的一種方法 範例：產生 pthread barrier 1 for (int i = 0; i \u0026lt; n; i++) pthread_join(thread[i], NULL) 要注意的是，若今天 thread 執行完之後，我們不需要把資料讀回來，則不用 call pthread_join，但多數的 thread 庫會要求 programmer call pthread_detach，告訴 library thread 結束後就直接 free 掉。若不去 call detach， OS 無法知道 thread 是否之後會被 join，導致 thread 的回傳值一直在等待，程式無法結束 pthread_detach(threadId) 一但 thread 被 detached，則永遠無法被 join Detach 一個 thread 可以 free 掉 thread 的資源\nLinux Threads Linux 在 kernel 不 support multithreading(因為 Linux 只有 process 或 task) User-level 可以使用 Pthreads 來實作多執行緒 fork system call: 產生新的 process 並完全複製 parent 的 data 及程式執行狀態 clone system call: 產生新的 process 並控制哪些 segment 要與 parent share 哪些不需要。因為 Linux 沒有 thread ，所以用 clone system call 來達到 thread 的概念 有一系列的 flag 來控制資料共享的程度，共享的資料以 pointer 的方式指向\nSemantics of fork() and exec() 若 process 有兩個 thread，其中一個 thread call fork() 可能有以下兩種情況\n部份 UNIX 系統支援兩種 fork() 的方式 execlp() 會取代整個 Process，而不是單一 thread Thread Cancellation 一個 thread 若執行結束後， main thread 必須有一系列 cancel 的動作 Asynchronous cancellation : main thread 會馬上中止 target thread Deferred cancellation (default option) : target thread 會預設一些中斷點，main thread 會週期性地確認是否執行到中斷點，等 target thread 執行到中斷點才中斷。 Signal Handling Signals(synchronous or asynchronous) 在 UNIX 系統中用來告知 process 某個事件發生 synchronous : 如不合法的記憶體存取 asynchronous : control-C Signal handler 處理 signals 的順序 Signal 被特定事件產生 Signal 被送到 process Signal 被處理 Signal 處理的 Options 傳送 signal 給 deliver signal 的 thread 傳送 signal 給所有 thread 傳送 signal 給特定的 thread 直接由 main thread 來處理 signal，如 file handler 的操作 Thread Pools 很多應用是直接產生一定數量的 threads，避免動態 thread 的產生、刪除時造成的 overhead，程式執行比較有效率，如 web server 優點 直接接收 request 通常比創建一個新的 thread 再接收 request 來得快 可以控制 threads 數量，進而控制系統的資源用量 threads pool size 的決定: 利用 # of CPUs, 預期的 # of request 以及記憶體大小來決定 Ch6 CPU Scheduling 相關資料\nBasic Concepts Multiprogramming keep 多個 process 在 memory 中 一次只有一個 process 在 CPU 執行，其他的 process 處於 waiting 狀態 當執行狀態的行程必須等待資源才能往下執行（I/O request），作業系統拿回CPU的控制權交給等待的行程 Process Scheduling 的目的是讓 CPU 在每個時刻都有工作可以做，增加使用效率 Process 基本上不是在執行 instruction，就是在執行 I/O，執行一連串的 instrunction 又稱為 burst(CPU burst \u0026amp; I/O burst) 一般來說，多數的 CPU burst 時間很短，少部份的 CPU burst 時間很長 一個 I/O Bound(I/O 密集) 的 Program 通常有很多短的 CPU burst (若沒有很長的 CPU burst，則通常是 I/O Bound) 一個 CPU Bound(計算密集) 的 Program 可能有一些很長的 CPU burst (如很長的 for loop)\nCPU Scheduler 從 Ready Queue 選擇誰可以被執行 (也就是將 Process 讀到 CPU 當中)\nPreemptive vs. Non-preemptive CPU scheduling 的決定時機主要有以下幾個 從 running 換到 waiting state 從 running 換到 ready state (CPU burst 被打斷，time sharing) 從 waiting 到 ready state 終止狀態 Non-preemptive scheduling: 若一個 process 可以繼續執行(在 CPU burst)，則不會被打斷 因此只會在上面 1. 跟 4. 的情況下作 re-scheduling 例如 Window 3.X Preemptive scheduling 在所有情況都有可能 re-sheduling 如 Windows 95 及之後的版本, Mac OS X Preemptive Issues Preemptive 最大的缺點是 synchronization 的問題 需要同步化 導致存取 shared data 的問題與對應的 cost 對 OS kernel 設計的影響 在 kernel 中做 lock \u0026amp; unlock 的設計 Unix 的解決方法是: 當在 run OS kernel 的 instruction 時，會把 timer disable，從 preemptive 變成 non-preemptive Dispatcher 由 scheduler 決定誰被執行，dispatcher 執行換人的動作，其負責 switching context 從 kernel mode 轉換到 user mode process 換了之後，page table 的 pointer、program counter(load 到新的 state) Dispatch latency: dispatcher 執行換人動作，停止一個 process，啟動另一個 process 所需的時間 Scheduling time Interrupt re-enabling time Context switch time Scheduling Algorithms Scheduling Criteria CPU utilization 理論上是 0% ~ 100% 實際上是 40% ~ 90% Throughput(從系統的角度) 單位時間完成的 processes 量 Turnaround time(從 single job 的角度) submission ~ completion（從ready ~ terminate的時間） Waiting time Process 執行期間在 ready queue 中等待的時間 所以 I/O Burst 不算在 waiting time Response time submission ~ 第一個 response 產生(第一個 CPU burst 開始執行) Algorithms FCFS Scheduling 依 (Burst time) 抵達順序執行(先來的先執行) P1(24), P2(3), P3(3)\nWaiting time: P1=0, P2=24, P3=27 Average Waiting Time (AWT): (0 + 24 + 27)/3 = 17 Non-preemptive Convoy effect: 很多 process 在等待一個很長 CPU Time 的 process，造成平均等待時間大幅增加的不良現象 Shortest-Job-First (SJF) Scheduling 時間最短的 process 先處理 運用行程下一個 CPU burst 的長度，而非 CPU burst total 長度 SJF 的 average waiting time 一定是最短的 Schemes Non-Preemptive SJF: 當一個行程拿到 CPU，不會被搶佔直到他完成\nPreemptive SJF: 當有新的行程且他的 CPU burst 的長度比較小，搶佔發生\nApproximate Shortest-Job-First (SJF) SJF 的難處是在執行下一個 CPU burst 之前，無法得知實際的執行長度 Approximate SJF: 下一個 burst 可預測為過去 CPU burst 長度的 exponential average\nPriority Scheduling 每一個 process 有一個 priority number CPU 被分配給高優先度的行程 Preemptive Non-preemptive SJF 可視為優先度的排程，其優先度是下一個預測的行程 CPU burst time 問題：Starvation – 優先度低的 process 可能不會被執行 解法：aging – 隨時間增加，若 process 還沒被執行到，則增加優先度 ex: 每 15 分鐘增加優先度 1 Round-Robin(RR) Scheduling process 執行時，可在 CPU 執行的時間(time quantum)有限制，通常是 10~100 ms 達規定的執行時間後，程式被 preempted 並加到 ready queue 的尾端 Performance TQ Large \u0026ndash;\u0026gt; 類似 FIFO TQ small \u0026ndash;\u0026gt; (context swtich) overhead 增加\nMultilevel Queue Scheduling Ready queue 切成分開的 queue 同一個 queue 通常放類似功能的 process 每一個 queue 有自己的排程演算法 因為還是只有一個 queue 的程式可以執行，所以 queue 之間也有排程，常見的作法是用權重的方式隨機挑選一個出來 Fixed priority scheduling：有 starvation 問題，若最上層的 queue 先做，下層的 process 可能一直做不到 Time slice：每個 queue 分配一定的 CPU time Multilevel Feedback queue Scheduling process 執行的狀況在 run time 才能得知，如過去 CPU burst 多少、呼叫了哪些 system call 等等，系統會在 run time 接收這些資訊並分類放到合適的 queue 中 process 可以在不同的 queue 中移動，因為也是一種 priority queue，也會有 starvation 的問題，通常搭配 aging 實作 一定先執行上層的 queue 依照 process CPU burst 的特性分類 I/O-bound 及 interactive 的 process 在較高層的 queue \u0026ndash;\u0026gt; short CPU burst CPU-bound 的 process 在較低層的 queue \u0026ndash;\u0026gt; long CPU burst\n當新的 job 抵達 Q0，以 FCFS (First Come First Serve) 演算法排程，若沒辦法在 8ms 內完成，則將 job 移到 Q1 同樣地 Q1 也是 FCFS ，若 job 在 16ms 內還是沒執行完，則被 preempted 並丟到 Q2 只有當 Q0 ~ Qi-1 是空的時候， Qi 中的 job 才會被執行 下一次回來 ready queue 時，系統會依照 feedback 判斷放在哪個 queue 中 (feedback 資訊會放在 PCB 中) 通常 scheduling 演算法由以下參數決定 queues 數量 每個 queue 的排程演算法 提昇/降級一個行程的方法 Evaluation Methods Deterministic modeling 以預定義的 workload 及演算法表現的好壞，缺點是難以通用化 Queueing model 數學分析 Simulation 以隨機數字產生器或 trace tapes 產生 workload Implementation 最準確的方式就是直接實作並觀察 Multi-Processor Scheduling Multi-Core Processor Scheduling Real-Time Scheduling Multi-Processor Scheduling Asymmetric multiprocessing 所有系統的執行會由一個 master processor 掌控 其他 processors 只執行 user code (由 master 配置) 遠比 SMP 簡單 Symmetric multiprocessing (SMP) 每一個 processor 都是 self-scheduling 所有 processors 共用 ready queue，或是每一個 processor 有自己的 ready queue 需要同步機制 Processor affinity Processor affinity: process 與執行它的 processor 之間有 affinity 關係 process 會將最近常使用的資料放在執行它的 processor 的快取中 快取的無效及資料重新放入是高成本的行為 Solution soft affinity: 允許 process 在不同 processor 執行 hard affinity: 只能在同一個 processor 執行 NUMA and CPU Scheduling NUMA (non-uniform memory access) 發生在結合 CPU 與 memory boards 的系統中 CPU scheduler 及 memory-placement 會一起工作 process 被配置在有 affinity 關係的 CPU 的 memory board\nLoad-balancing 讓不同 processors 間的 workload 盡量平均 只在 processor 有 private queue 的系統下才需要 兩種策略 Push migration: 將 processes 移動到閒置或 less-busy 的 processor 中 Pull migration: 閒置的 processor 將等待中的 task 從其他忙碌的 processor 中拉過來 通常是平行實作 Load balancing 經常抵銷 processor affinity 帶來的效益 Multi-core Processor Scheduling Multi-core Processor: 更快且更少的 power 消耗 memory stall: 當存取記憶體時，花費許多時間在等待資料 available (e.g. cache miss) Multi-threaded multi-core systems 兩個(或更多)的硬體 thread 被 assign 給每一個 core (i.e. Intel Hyper-threading) 當一個 thread 在存取記憶體時，其他 thread 就可以執行 CPU 指令\nTwo ways to multithread a processor coarse-grained: 當 memory stall 發生時切換到另一個 thread，因為 instruction pipeline 必須被 flush 所以成本很高 fine-grained(interleaved): 把 pipeline 的狀態保留並切換到另一個 thread 執行，需要更多的 register 來保存資料 Scheduling for Multi-threaded multi-core systems 1st level: 選擇某個 software thread 執行在每個 hardware thread(logical processor)\n2nd level: 每個 core 如何決定執行哪一個 hardware thread Real-Time Scheduling Real-time 不代表越快越好，重點在 deadline 前要完成 Soft real-time 雖然不希望超過 deadline，但並不會馬上出問題 例如影音串流 Hard real-time 若超過 deadline 則導致 fundamental failure 例如核電廠的控制 Hard real-time Real-Time Scheduling Algorithms FCFS scheduling algorithm – Non-RTS T1 = (0, 4, 10) == (Ready, Execution, Period) T2 = (1, 2, 4) Rate-Monotonic (RM) algorithm 依據頻率的大小來做排程 更短的週期(週期是固定的數值，在 run time 期間不會變動) \u0026ndash;\u0026gt; 更高的優先度 同一個 task 的所有 job 都有一樣的 priority task 的優先度是固定的 Fixed-priority RTS scheduling algorithm\nEarliest-Deadline-First (EDF) algorithm 更早 deadline \u0026ndash;\u0026gt; 更高的優先度 動態優先的演算法\nOperating System Examples Solaris Scheduler Priority-based multilevel feedback queue scheduling 有六類 scheduling，一個 process 只會屬於某一類: real-time system time sharing interactive fair share fixed priority 每一個類有自己的 priority \u0026amp; scheduling 演算法 Scheduler 會將類的優先度轉換為 global 的優先度\nSolaris Example(time sharing, interactive) 優先度與 time slices 成反向關係，time slice 越小的優先度越高 Time quantum expired: 當 thread 在沒有 blocking 的狀況下使用整個 TQ，則重新排優先度 Return from sleep: 若 thread 從 sleeping(I/O wait)回來 ready queue 時，會重新排優先度 期望 CPU-bound 的 process 慢慢往下沉，I/O-bound 的 process 慢慢上浮\nWindows XP Scheduler Multilevel feedback queue 優先度分為 0~31，由優先度最高的 queue 開始排程 優先度最高的 thread 永遠在執行 每一個 priority queue 使用 Round-robin 除了 Real-time 的 task 之外，優先度在 run time 時期動態變更\nLinux Scheduler Preemptive priority based scheduling 只有 user mode processes 可以被 preempted 兩個不一樣的 process priority ranges 值越低優先度越高 TQ 較高者有更高的優先度 Real-time tasks: (priority range 0~99) static priorities Other tasks: (priority range 100~14-) 依 task 執行狀況動態決定優先度\nScheduling algorithm 若一個 task 還有剩餘的 TQ，則 task 可以被執行，只要還沒耗盡 TQ，都會保留在 active array，希望每一個 task 都能用完它的 TQ 當 task 耗盡 TQ，則為 expired 且不應被執行，移到 expired array task expire 後，系統會決定新的優先度以及 TQ\nCh5 Process Synchronization 當共享的資料同時被不同 Process / threads 存取時，因為執行順序的不確定性，很容易發生 data inconsistency 的狀況，所以需要額外的機制來確保程式的正確性，也就是 Synchronization 以下為常見的 Consumer \u0026amp; Producer Problem\n除了 Buffer 之外， Counter 也是 share variable，要注意的是 counter++ 及 counter-- 在 instruction level 其實有三道指令，以 counter++ 為例，要先將 counter 從記憶體中移到 register，加上 1 之後，再存回記憶體。由於 context switch, Preemptive scheduling 等因素， 這些指令可能不是一次執行完成，導致執行結果不符合預期\n1 2 3 move ax, counter add ax, 1 move counter, ax Race Condition 當多個 Processes 同時存取及操作 shared data 時，最終的值取決於最後一個完成執行的 Process，這個現象稱為 Race Condition\n在 single-processor machine 中，我們可以 disable interrupt 或著使用 Non-preemptive scheduling 來達成同步，但在 User Program 中不可能使用，會影響整個系統的運作 通常將可能產生 Race Condition 的區域稱作 Critical Section Critical-Section Problem 目的：建立 Processes 之間合作的 protocal Problem description N 個 Processes 競爭使用 shared data 每一個 Process 存取 shared data 的 code segment 我們稱為 critical section 若我們確保當一個 Process 執行 critical section 時，其他 Processes 不得執行 critical section，稱之為 mutually exclusive，是比較暴力的解法 一般常見 critical section 的架構如下\nCritical-Section Requirements Mutual Exlusion： 當一個 Process 執行 critical section 時，其他 Processes 不得執行 critical section Progress： 若沒有 Process 在執行 critical section，且有某些 Processes 希望進入它的 critical section，則 Process 不得在未定義的情況下被推遲，一定要進的去 Bounded Waiting： Process 等待進入 critical section 的期限必須受到限制，不可一直排隊等待 Critical-Section Solution \u0026amp; Synchronization Algorithm for Two Processes 我們先以兩個 Processes 的簡單例子做講解 只有兩個 Process P0 \u0026amp; P1 共享變數 int turn turn = i \u0026ndash;\u0026gt; Pi 可進入 critical section\n以上的程式碼其實並不完美，這個程式要能順利運作的前提是，兩個 Process 必須輪流執行，但 while loop，並不保證執行的順序，很有可能 Process 0 執行完一次，又想進入 critical section，但 Process 1 還沒執行到 turn = 0 這一行，P0 就會卡在 while loop ，不符合 progress Peterson’s Solution for Two Processes 為了解決上述 Progress 的問題，我們引入另一個變數 flag ，用來表示 Process 是否想要進入 critical section 中，當 flag[i] = True 的時候，代表 Pi 已經準備好要進入 critical section，turn = j 代表把 key 交給別人。所以 while 條件式 flag[j] \u0026amp;\u0026amp; turn==j 的意義為檢查其他 Process 是否可進入 critical section，確認沒有其他 Process 要進入 critical section 後，自己再進入 critical section。 要注意如果 turn = j 不是把 token 交給別人而是搶過來用，當某個 Process 先進入 critical section，輪到另一個 Process 時也可以 break while 迴圈，但無法進入 critical section 導致 deadlock\n簡單的證明 Peterson’s Solution\nMutual exclusion : turn 不可能同時為 0 或 1，因此不可能同時進入 critical section Progress : 若 P1 尚未準備好 \u0026ndash;\u0026gt; flag[1] = False \u0026ndash;\u0026gt; P0 可以進入 若兩者都準備好 \u0026ndash;\u0026gt; flag[0] = flag[1] = True 若 turn = 0 則 P0 進入，否則 P1 進入 以上兩種狀況，Process 都可以順利進入 critical section\nBounded waiting : 若 P1 離開 critical section \u0026ndash;\u0026gt; flag[1] = False \u0026ndash;\u0026gt; P0 可以進入 若 P1 離開 critical section 後，繼續執行 while loop \u0026ndash;\u0026gt; flag[1] = True \u0026ndash;\u0026gt; turn = 0 (覆寫 P0 原先的 turn = 1) \u0026ndash;\u0026gt; P0 可以進入 以上兩種狀況，P1 進入後接著進去的一定是 P0，符合 Bounded Waiting 的要求\nProducer/Consumer Problem 情況一：我們將所有程式碼都放入 critical section，如果 consumer 先 call，因為 buffer 是空的，所以 consumer 會卡在 while 迴圈 ; 這時再 call producer ，因為 consumer 已經在 critical section 裡頭， producer 無法進入導致 deadlock\n情況二：我們只將可能產生 race condition 的程式碼放進 critical section，雖然執行結果正確，但如果某一個 Process 進入 critical section 其他 Process 進不去，可能導致無謂的 context switch 降低效率\nBakery Algorithm (n processes) 在進入 critical section 之前，每一個 Process 會抽號碼牌 號碼牌數字最小的先進入 critical section (注意可能有相同的號碼牌，如下方程式碼以 max 實作，而 max 指令其實有好幾行) 號碼牌數字的產生一定是 non-decreasing order; i.e. 1,2,3,3,4,5,5,5… 若兩個 Process Pi \u0026amp; Pj 有相同的號碼牌，則 PID 小的先進入 choosing[i] 為是否正在抽號碼牌的 flag，在與其他 Process j 比較之前，我們必須等待 Process j 抽完號碼牌。考慮一個狀況， Process j 比 i 晚抽完號碼牌，但號碼與 i 一樣大，又 j 的 PID 比 i 小，所以 Process j 應該要先執行 ; 如果在 j 還沒抽號碼牌之前就進行比較，此時 num[j] = 0，程式會以為 j 不要執行，反而先執行 i，當 j 抽完號碼牌之後發現數字與 i 相同，因此也可以進入 critical section，但這時 i 已經在裡頭，導致 deadlock。\nPthread Lock/Mutex Routines Condition Variables (CV) Condition Variables 代表一個條件，符合該條件時可以觸發 thread 執行某些動作 三種 CV 的操作 wait() : 直到其他 thread 呼叫 signal()/broadcast()，thread 處於等待狀態 signal() : 喚醒一個等待中的 thread broadcast() : 喚醒所有等待中的 thread 在 Pthread 中，CV type 為 pthread_cond_t 使用 pthread_cond_init() 來初始化 pthread_cond_wait (\u0026amp;theCV, \u0026amp;somelock) pthread_cond_signal (\u0026amp;theCV) pthread_cond_broadcast (\u0026amp;theCV)\n上圖執行順序如下： action() 進入 CS，呼叫 thread_cond_wait 並釋放 lock counter() 取得 lock 進入 CS counter() 呼叫 singal() ，action() 被喚醒，注意這時候 action() 是沒有 lock 的 counter() 釋放 lock action() 取得 lock 並執行函式 ThreadPool Implementation 一次創建一定數量的 threads，讓系統不用一直增刪 threads，並且讓系統可以有效控制 threads 的數量，避免過多的 context switch 反而降低效率，達到效能最佳化。\n創建 threads 後，為了讓 threads 執行不同的 function，會建立一個 threadpool_task_t 的結構體，存放函式及對應參數的指標，因此 threads 在經過 while loop 被喚醒之後，執行目前看到 threadpool_task_t 的函式，等於處理了一個 request，處理完成後進入 wait 狀態，等待下次被喚醒。而 threads 要如何知道被喚醒，其中一個方式是透過 Condition Variable 判斷 以下程式碼為一個簡單的範例：\n創建 threads pool 以及 task 的 queue thread 執行 while loop 處於 wait 狀態 若 thread 被喚醒則離開 while loop，並執行 queue 中 pool-\u0026gt;head 的函式 執行後 pool-\u0026gt;head 加 1，再判斷該值是否等於 queue_size，若相等表示已經執行到最後一個函式，將 pool-\u0026gt;head 設為 0 離開 critical section 執行任務\nHardware Support Critical Section Problem 的發生是因為 shared variable 的修正可能被打斷，若某些指令我們可以一行完成，就可以避免 race condition 的問題。前面都是在說軟體上的支援，若硬體可以將指令變成 atomic instructions ，就沒有同步的問題\natomic : 無法中斷執行的最小單元 例如 : TestAndSet(var), Swap(a,b) Atomic Test And Set() 注意以下程式碼不符合 Bounded waiting\nAtomic Swap() 先 call Swap 的取得進入 critical section 的權力，執行完成後將 token 還給 lock。注意以下程式碼不符合 Bounded waiting\nSemaphores Samaphores 是一個通用的同步處理工具，其紀錄某個資源有多少 units 可以去使用 若 # of record = 1 \u0026ndash;\u0026gt; binary semaphore, 但其實用 mutex lock 就好 若 # of record \u0026gt; 1 \u0026ndash;\u0026gt; counting semaphore 利用兩個 atomic operations wait \u0026amp; signal 來存取 (注意與 critical section 的 wait \u0026amp; signal 不同) 簡單的 Spinlock 以 semaphore 實作\nSemaphore 為 POSIX 標準庫之一，不屬於 Pthread，所以使用上不限於 thread ，也可以用於 Process Non-busy waiting Implementation Busy waiting (SpinLock) 因為 while loop，執行效率沒有被最佳化，所以相對 busy waiting 就有 non-busy waiting 的實作方式，但 system call 要考慮 context switch、re-scheduing 的影響，成本比 while 來得高。一般來說，等待時間很短的，我們會用 busy waiting，反之則使用 non-busy waiting\nSemaphore 為一個有 queue 的結構體，包含 Semaphore 的值以及有哪些 Processes 等待被執行\nwait() \u0026amp; signal() 使用 system calls: sleep() \u0026amp; wakeup() 一樣必須為 atomic 的操作 必須先進行 value\u0026ndash;(++) 操作，避免進入 if 區域後被 sleep 無法執行 由於 value--(++) 還有 queue 的 insert, delete 等，必須確保 wait() \u0026amp; signal() 為 atomic 操作 single-processor : 透過 disable interrupts multi-processor : HW Support (e.g. Test-And-Set, Swap) SW Support (Peterson’s solution, Bakery algorithm) Semaphore with Critical Section 將 value--(++) 以及 queue 的操作包進 critical section 因為 sleep() 及 wakeup() 為 system calls，無須擔心同步的問題， OS 會妥善處理，所以不用包進 critical section 中(也不該包進去)\nCooperation Synchronization 有些情況不同 Process 間的執行順序很重要，考慮兩個 thread P1 \u0026amp; P2 分別執行 S1 \u0026amp; S2，S2 必須在 S1 完成後才可執行 實作方式 : 利用 shared variable semaphore sync ，以下程式碼確保 S1 一定先執行完成\n更複雜的情況概念相同，由上述兩個 Processes 的例子做延伸\nClassical Synchronization Problems 常見的問題如下：\nBounded-Buffer (Producer-Consumer) Problem Reader-Writers Problem Dining-Philosopher Problem Reader-Writers Problem 標準在處理 I/O 會遇到的問題 A set of shared data objects A group of processes reader processes (read shared objects) writer processes (update shared objects) writer process 對 shared object 有獨佔權 不同的種類 first RW problem : 只要確定 writer 有 access 的獨佔權即可，不關心 reader 要等多久，或要做什麼事情。reader 取得 token 時，可以傳給其他 reader，可能造成 writer 一直被其他 reader 插隊，永遠拿不到 lock second RW problem : 不只要確定 writer 的 access 權限，另外當 writer ready 且 object 被釋放時，writer 的優先性必須高於 reader ，不可有新的 reader 進來插隊 First Reader-Writer Algorithm\nwriter 為 binary semophore Reader 共享一個 block readcount 計算有幾個人要讀 當 readcount \u0026gt; 1 時，代表已經有 reader 拿了 lock，所以這個 reader 也可以讀 當 readcount = 1 時，因為是第一個 reader，可能要等 writer 結束才可讀取 當 readcount= 0 岱表示最後一個讀的，讀完後要 signal writer readercount 為 shared variable，必須受到保護 Writer可能會有 starvation problem ，因為只要有 reader 在讀，其他 reader 都可以進入 critical section，造成 writer 一直在等待狀態 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 // mutual exclusion for write semaphore wrt=1 // mutual exclusion for readcount semaphore mutex=1 int readcount=0; // writer Writer(){ while(TRUE){ wait(wrt); // Writer Code signal(wrt); } } // reader Reader(){ while(TRUE){ wait(mutex); readcount++; if(readcount==1) wait(wrt); signal(mutex); // Reader Code wait(mutex); readcount--; if(readcount==0) signal(wrt); signal(mutex); } } Dining-Philosopher Problem 5 個人坐在 5 張椅子上，且有 5 支筷子 每個人只會思考或是吃飯 思考時與剩下 4 個人沒有互動 每個人要用餐需要兩支筷子 一個人 1 次只能拿 1 支筷子 吃完飯後，將兩支筷子都放下 若每個人都拿其中一邊的筷子，就 deadlock 了 starvation problem\nMonitor 雖然 semaphores 提供非常便利及有效的同步機制，但正確性主要是依賴 programmer\n所有存取 shared data object 的 processes 都需確保 wait() \u0026amp; signal() 的執行順序及位置正確 但是人總有可能犯錯 可以將 Moniter 想成一個特殊 class (high level language construct)，每一個 Moniter 都有可能發生 race condition 的 local variable (對應下圖的 shared data) 需要保護，而要操作這些 var 必須透過 Moniter 的 method。 Monitor 與 OO 最重要的差異為，Monitor 一次只有一個 thread 可以執行其 method。(但可以很多個 threads 同時 call 這個 method，只是會處於 inactive 狀態) monitor 利用 queue 做排程，確保一次只有一個 process 是 active 的，保護 shared data\nMonitor Condition Variables 為了允許 process 等待 monitor，需要宣告 condition variable，例如 condition x, y; condition variable 只能與 wait() 及 signal() 一起使用 x.wait() 代表調用這個 operation 的 process 被閒置，直到其他 process 完成為止 x.signal() 啟動一個等待中的 process，若沒有 process 處於等待狀態，則 signal() 操作沒有任何影響。與其相反，semophore 的 signal() 一定會改變 semaphore 的狀態 (wait 把 counter 減 1; signal 把 counter 加 1) 在 monitor 當中，condition variable 不是 counter 而是一個佇列，所以 x.wait() 類似把 process 放到 waiting queue (enqueue)，而 signal 則是在 dequeue，所以如果 queue 是空的，signal 就沒有任何作用 Monitor 可以有很多個 threads 存在，但一次只有一個 active\nDining Philosophers Example monitor type\n建立三個狀態 thinking, hungry \u0026amp; eating 建立 shared variable self[5]，存放每個人的狀態 P.S. 可以用 shared variable 都還算好解決，難解的是無法得知他人狀態的問題 定義 4 個 method 1 2 3 4 5 6 7 8 9 10 11 monitor dp { enum {thinking, hungry, eating} state[5]; //current state condition self[5]; //delay eating if can’t obtain chopsticks void pickup(int i) // pickup chopsticks void putdown(int i) // putdown chopsticks void test(int i) // try to eat void init() { for (int i = 0; i \u0026lt; 5; i++) state[i] = thinking; } } void pickup(int i) 將狀態設為 hungry，代表要吃東西了 測試拿筷子後是否可以吃 若狀態沒有改變，表示測試失敗，把自己放到 wating queue 1 2 3 4 5 6 7 void pickup(int i) { state[i] = hungry; test(i); // try to eat if (state[i] != eating) // wait to eat self[i].wait(); } voild putdown(int i) 吃完了將狀態改為 thinking 告知左右兩邊進行測試，看有沒有辦法吃 1 2 3 4 5 6 void putdown(int i) { state[i] = thinking; // check if neighbors are waiting to eat test((i+4) % 5); test((i+1) % 5); } void test(int i) 若左右兩邊的人都沒在吃，代表左右兩邊手上都沒筷子，還要確認自己是否想吃東西 都符合的話，將狀態改為 eating 並喚醒 thread/process 1 2 3 4 5 6 7 8 9 10 // try to let Pi eat (if it is hungry) void test(int i) { if ( (state[(i + 4) % 5] != eating) \u0026amp;\u0026amp;(state[(i + 1) % 5] != eating) \u0026amp;\u0026amp; (state[i] == hungry) ) { //No neighbors are eating and Pi is hungry state[i] = eating; self[i].signal(); // If Pi is suspended, resume it // If Pi is not suspended, no effect } } Atomic Transactions Transactions : 執行一個單一邏輯函式的指令集合 Atomic Transactions : 執行單一邏輯函式，一次全部執行，或完全不執行 Atomic Transactions 在 database system 系統中是個非常重要的議題 File I/O Example\nTransactions 為一系列讀寫的動作 透過 commit 以及 abort 來確認動作完成 transaction 成功 : commit \u0026ndash;\u0026gt; terminated transaction 失敗 : abort \u0026ndash;\u0026gt; roll back abort 的 transaction 必須回溯，取消所有做過的改變，這個性質的確保為 system 的責任 Log-Based Recovery\n紀錄所有 transaction 的步驟及做過的改變 Stable storage : 絕對不會丟失儲存的資料 Write-ahead logging : 基本上 log 紀錄需包含以下資訊 Transaction name Data item name Old \u0026amp; new values Special events: (Ti starts), (Ti commits) Log 用來重建被改動資料的原始狀態 利用 undo(Ti) 及 redo(Ti) 來復原資料 Checkpoints Logging 的問題是沒有時間觀念，從系統打開到系統崩潰為止一直紀錄，因此需要 checkpoint 留存系統還原點 (例如強制關機時 word 沒有存檔，重開後系統會問你是否要還原至關機瞬間的狀態)，從 checkpoint 來做 roll back 的動作\n當 failure 發生時，必須查看 log 來確認哪些 transactions 要重新執行 搜尋的過程很花時間 並非所有 transactions 都需要重新執行 利用 checkpoints 來減少上述 overhead 輸出所有 log 紀錄來達到 stable storage 輸出所有被更動的資料來達到 stable storage 輸出紀錄 checkpoint 的 log 來達到 stable storage Ch7 Deaklock Deadlock Problem 一系列被 blocked 的 processes 持有部份資源且都在等待獲得其他 processes 擁有的資源 Ex1: 2 processes and 2 tape drivers 每一個 process 擁有一個 tape drive 每一個 process 要求其他的 tape drive Ex2: 2 processes and semaphores A \u0026amp; P1 (holb B, wait A): wait(A), signal(B) P2 (holb A, wait B): wait(B), signal(A) 必要條件 Mutual exlusion 一次只能有一個 process 可以使用資源 Hold \u0026amp; Wait (同時 Hold \u0026amp; Wait) 一個 process 持有某些資源且等待其他 processes 擁有的資源 No preemption (有些情況很難保存 state 或保存的 cost 很高) 資源只能被持有的 process 自己放棄 Circular wait 存在一系列等在中的 processes {P0, P1, …, Pn} 形成環狀等待 P0 -\u0026gt; P1 -\u0026gt; P2 -\u0026gt; … -\u0026gt; Pn -\u0026gt; P0 當以上四個條件都發生時，才會有可能的 deadlock 的情況發生 System Model 資源類型 R1, R2,…,Rm 如 CPU, memory pages, I/O devices 每一個資源類型 Ri 有 Wi 個 instance 如一個電腦有兩個 CPUs 每一個 process 使用資源方式如下 Request -\u0026gt; use -\u0026gt; release Resource-Allocation Graph 3 個 processes, P1 ~ P3 4 個 resources, R1 ~ R4 (資源可能有多個 instances) R1 \u0026amp; R3 各有一個 instance R2 有兩個 instance R4 有三個 instance Request edges P1 -\u0026gt; R1: P1 要求 R1 Assignment edges R2 -\u0026gt; P1: 一個 R2 的 instance 被 assign 給 P1 若圖上有 circular 存在，則可能有 deadlock 存在 左圖有 deadlock，右圖沒有 deadlock\nDeadlock Detection 若圖沒有 cycle \u0026ndash;\u0026gt; 沒有 deadlock 因為 Circular wait 不會形成 若圖有 cycle 若每一個資源類型都只有一個 instance \u0026ndash;\u0026gt; deadlock 若每一個資源類型都有多個 instance \u0026ndash;\u0026gt; 可能會 deadlock Handling Deadlocks 方法1.，確保系統永遠不會進入 deadlock 的狀態 deadlock prevention: 確保四個條件中至少一個條件沒有滿足 deadlock avoidance: 分配資源前，Run-time 動態地檢查目前資源分配的狀況 方法2.，允許 deadlock，發生再想辦法修復 deadlock detection deaklock recovery 方法3.，忽略問題且假設系統中永遠不會發生 deadlock 大多數作業系統使用此方法，包含 Unix 系統 Deadlock Prevention Mutual exclusion (ME): 將不需要 ME 的資源取消 ME read-only 的資料不需要 mutual exclusion 但有些資源不能共享，如 critical section、printer 等 Hold \u0026amp; Wait: 當一個 process 請求資源時，process 不能持有任何資源 必須讓所有的資源一次性地都有對應的 process 處理，才進行下一步動作 缺點是資源使用率非常低，可能很多 process 一直在 acquire 跟 release，沒辦法真正的執行 No preemption: 當 process 在等待資源時，該 process 持有的所有資源必須 preempted 掉 e.g. P1 請求目前被 P2 使用的 R1，而 P2 在等待 R2 P2 紀錄目前執行的狀態後，R1 可以被 preempted 掉，並重新分配給 P1 使用 適合用在容易紀錄及恢復狀態的資源，如 CPU 的 register (context switch) 或 memory Circular Wait: 對所有資源類型加上 total ordering，讓資源的取得有方向性 process 依遞增的順序來取得資源 若$R=R_0,R_1,\u0026hellip;,R_N$為一系列資源 當 process 要求 $R_k$時，必須將所有$R_i,i\u0026gt;=k$ 釋放掉才可拿取資源 例如現在有三個資源 F(tape drive) = 1, F(disk drive) = 5, F(printer) = 12，process 在拿 printer 的資源時，一定要將 printer 釋放掉，才能拿 tape \u0026amp; disk drive 證明：要形成 Circular Wait，一定有以下情況 $P_0(R_0)-\u0026gt;R_1,P_1(R_1)-\u0026gt;R_2,\u0026hellip;,P_N(R_N)-\u0026gt;R_0$ 但這樣代表 $R_0$ 必須大於 $R_N$，產生矛盾 Deadlock Avoidance 若無法做 Preventon，則必須在 run time 期間進行動態檢查\nAvoidance Algorithms Single instance of a resource type resource-allocation graph (RAG) algorithm based on circle detection Multiple instances of a resource type banker’s algorithm based on safe sequence detection Resource-Allocation Graph (RAG) Algorithm Request edge:\n$P_j-\u0026gt;R_j$，$P_j$在等待$R_j$的資源 Assignment edge:\n$R_j-\u0026gt;P_j$，$R_j$被$P_j$所持有 Claim edge:\n$P_j-\u0026gt;R_j$，$P_j$在未來可能要求$R_j$ 當 process 要求資源時，claim edge 轉換成 request edge 當資源被 process 釋放時，Assignment edge 轉換成 Claim edge\nAvoidance 基本上使用有向圖的方式建立 Claim edge，確認當任務 Assign 時是否有 Loop 產生，若產生迴圈則將拒絕或延遲該請求，如下圖 $P_1−\u0026gt;R_2$的請求在該狀況下不會被同意\nCycle detection 的演算法為 $O(n^2)$\nMultiple instances Safe state: 若存在 sequence allocation 滿足所有 process 的請求，則系統處於 safe state 此 sequence of allocation 稱為 safe sequence safe state -\u0026gt; no deadlock unsafe state -\u0026gt; 可能有deadlock deadlock avoidance: 確保系統永遠不會進入 unsafe state Safe State with Safe Sequence\n有 12 個 tape drives t0 的狀態如下\n$P_0$最多可能會一次要 10 個資源，才能執行下一個動作 目前已使用 9 個資源，剩下 3 個資源，因為$P_1$最多只需要 4 個，所以我們可以先把剩下的 3 個資源全部先給$P_1$，$P_1$執行完之後可用資源變成 5 個。這時候將 5 個資源全部給$P_0$，最後再給$P_2$就可以順利執行所有的 process，$\u0026lt;P_1,P_0,P_2\u0026gt;$稱為 safe sequence Un-Safe State w/o Safe Sequence\n仍然可能找不到 safe sequence，如下圖剩下 2 個資源，$P_1$執行後無論給$P_0$或$P_2$都不夠\n但仍未進入 deadlock 的狀態 這時候$P_0\u0026amp;P_0$的請求就會被拒絕或延遲 Banker’s algorithm\n適用於對每個資源是 multiple instances 的情況 使用通用的 safety algorithm 預先決定是否有 safe-sequence 存在 只在 safe-sequence 存在時才會去執行動作 Algorithm： 假設 processes 需要 Maximum resources 找到一個 free resources 可以滿足的 process，將所有 free resources 給它 將該 process 的所有資源釋放掉 重複上述動作直到所有的 processes 都可滿足執行條件 範例： Total instances: A=10, B=5, C=7 初始 available 的 instances: A=3, B=3, C=2 Safe sequence 為 P1 -\u0026gt; P3 -\u0026gt; P4 -\u0026gt; P2 -\u0026gt; P0\nDeadlock Detection 偵測目前系統狀態有沒有 deadlock\nSingle instance 將 request/assignment edges 轉換為 wait-for graph 若 wait-for 存在 circle 則有 deadlock Multiple instances: 不用管 Maximum Needs，只要確認 request 會不會造成 deadlock Total instances: A:7, B:2, C:6 Available instances: A:0, B:0, C:0 safe state -\u0026gt; \u0026lt;P0, P2, P3, P1, P4\u0026gt; -\u0026gt; no deadlock If P2 request = \u0026lt;0, 0, 1\u0026gt; -\u0026gt; no safe sequence -\u0026gt; deadlock\nDeadlock Recovery Process termination kill 全部的 deadlock processes kill 一個或多個在 deadlock circle 的 process 要決定哪些 process 應該被砍掉，即便砍掉 priority 最低的 process 也不一定能解決 deadlock 的問題，這是一個需獨立出來討論的議題 Resource preemption 選擇一個 victim 去 preempt 哪一個應該被 preempt ? rollback 部份或全部 rollback ? starvation 若一直 preempt 相同的 process，則該 process 可能要等待很久的時間才能被執行 CH11 File System Interface File Concept File: 為 OS 所創造的邏輯儲存單元 (logical storage unit) 實體儲存單元 (physical storage unit) 則是 disk (sector, track) File 的屬性 Identifier: non-human-readable name, Name, Type, Location, Size, Protection, Last-access time, Last update time File 的操作 創建、讀寫、repositioning、刪除、截斷 (truncate)、串接 (concatenate) Process 會儲存一個 open-file table Os 會儲存一個 system-wide table Open-File Tables Open-file table 儲存 process 開啟的檔案資訊 紀錄所有被這個 process 開啟的檔案 每一個開啟檔案的指標 檔案的存取權以及 Accounting information (CPU數量，真實使用的時間, 時間限制, 帳戶數量, 行程數量) System-wide table 儲存 OS 系統所有開啟的檔案資訊 open-file tables 所有檔案指向 system-wide table 還會儲存獨立於 process 的資訊，如 disk location, access dates 還有 file size Open count 紀錄各個檔案被指向的次數，代表目前有多少 user 在存取該檔案 若不同 process 存取同一個檔案，只會有一份檔案，確保資料的一致性\nOpen-File Attributes Open-file attributes (metadata) File pointer (per-process) File open count (system table) Dist location (system table) Access rights (per-process) File types 副檔名，如 .exe, .com, .obj …etc 副檔名沒有實質意義，只是讓 OS 先嘗試用副檔名對應的應用程式開啟 Access Method Sequential access: 檔案可以視為 Array of bytes，Sequential access 在讀檔時是連續讀取的，因此需要的資訊就是目前的位置以及要讀取多少長度 Read/write next (block) Reset: 將 file pointer 重設到檔案的開頭 Skip/rewind n record 因為硬碟磁寫頭的關係，連續的檔案讀寫效率較高 邏輯上的連續，檔案儲存的實體硬碟位置不一定要連續\nDirect (relative) access: 直接告訴系統要讀取檔案什麼位置的資料 讀取 sequence 資料的任意元素 File operations 需要 block number 作為參數 通常是為了 random access 的執行 檔案由多個大小固定的區塊所組成，可直接將檔案指標移動到某個特定的區塊，並一次讀取整個區塊\nIndex Access Methods Index: 檔案各區塊的指標 為了找到檔案中的 record: 尋找 index file \u0026ndash;\u0026gt; 找到指標 利用指標去直接存取 record 若檔案太大， index 有可能太大\nPhysical 的硬體設備，執行 random access 類型的操作效率較低，如果要支援 random access，通常要有 memory cache 才會夠快 Directory Structure Partition, Volume \u0026amp; Directory A partition 硬碟分割 (formatted or raw) raw partition (無檔案系統)： UNIX swap space, database Volume 意指在硬碟格式化有了檔案系統之後的磁碟區域 一個 partition 可以為硬碟的部份區域或是由多個硬碟組成 (如分散式系統) 有一些儲存設備無法被分割，如 floppy disk (ex: 3.5 磁碟片) Dirctories 為檔案系統在 partition 儲存檔案資訊的區塊\nDirectory vs. File Directory: 為一群包含所有檔案資訊的節點 Directory structure 跟 files 都位於硬碟中\nDirectory 相關的操作 搜尋檔案、創建檔案、刪除檔案、列出目錄清單(對現代檔案系統常常是效能瓶頸處，因為可能資料很多、檔案的樹狀結構很深)、重新命名檔案、遍歷檔案樹狀結構 Single-Level Directory 所有檔案都在一個 Directory 底下 檔案名稱必須唯一 當檔案越來越多，找尋檔案的效率非常差 (一定要遍歷)\nTwo-Level Directory 對每一個使用者有不同的 directory 路徑 = user name + file name 但是對每一個 user 來說，搜尋的效率仍然很差\nTree-Structured Directory 絕對路徑： 由根節點開始 相對路徑： 由 directory (子節點)開始\nAcylic-Graph Directory 使用 links 來共享檔案或 directories UNIX-like: symbolic link (ln -s/spell/count/dict/count)(\u0026lt;新連結位置\u0026gt; \u0026lt;原被連結位置\u0026gt;) 檔案可以有多個絕對路徑 (同個檔案給不同節點使用) 那何時檔案才真正被刪除？ 刪除檔案但留下 link \u0026ndash;\u0026gt; dangling pointer 真正保險的作法是刪除 link 但不刪除檔案，當檔案的 counter 歸零時才把檔案刪除\nGerneral-Grpah Directory 與 Acylic-Graph 最大的差異是可能有迴圈 counter 在這邊無法確保 dangling pointer 可能有 self-referencing file 所以問題在於要如何處理 dangling pointer 定期做 Garbage collection 首先遍歷整棵樹，標記樹可達到的檔案及 directories 將沒有被標記的檔案 free 掉 但是當檔案很多時效率很差，所以很多檔案系統不支援 另一種解法是在檔案被建立時確認是否會產生迴圈\nFile-System Mounting \u0026amp; File Sharing File Mounting 要使用檔案系統時，必須先掛載到系統中，系統才能存取 Mounting point: 意指 File System 被掛載的根路徑 Mounting time: boot time (如系統槽，作業系統也是存在檔案系統中) automatically at run-time，如 usb 自動偵測 manually at run-time\nFile Sharing on Multiple Users 對每一個使用者會有 (userID, groupID) ID is associated with every ops/process/thread the user issues 一個 user 可以屬於多個 groupID 每一個 file 有三種屬性等級 owner (擁有者權限) group (所屬 group 的權限) others (非擁有者也非 group 成員的權限) 擁有者 attributes 描述擁有者對檔案操作的權限 group/others 也有對應的 attributes group/others 的權限由 owner 或 root 決定\nAccess-Control List 為了控制不同層級使用者的檔案權限，對每個 user 建立 Access-control list 當使用者發出對檔案操作的請求時，透過 ACL 的資訊來確認是否合法 但當使用者數量很多時，透過 ACL 確認太耗費資源及時間 現行作法是將使用者分成 3 類 \u0026ndash;\u0026gt; 用 3 個 bit (RWX) 描述不同層級 user 對檔案的執行權限 owner (e.g. 7 = RWX = 111) group (e.g. 6 = RWX = 110) public (others) (e.g. 4 = RWX = 100) 如下圖第一行中的 -rw-rw-r–，分別代表 owner-group-others 的權限\nFile Protection 檔案的擁有者/創建者必須能控制\n能執行哪些操作 誰能執行這些操作 由 ACL 定義 檔案應該要防止以下問題\nphysical damage (reliability): i.e. RAID 不適當的存取: i.e. 密碼 RAID:\n以下出自 Wiki 容錯式磁碟陣列（RAID, Redundant Array of Independent Disks），舊稱容錯式廉價磁碟陣列（Redundant Array of Inexpensive Disks），簡稱磁碟陣列。利用虛擬化儲存技術把多個硬碟組合起來，成為一個或多個硬碟陣列組，目的為提升效能或資料冗餘，或是兩者同時提升。 在運作中，取決於 RAID 層級不同，資料會以多種模式分散於各個硬碟，RAID 層級的命名會以 RAID 開頭並帶數字，例如：RAID 0、RAID 1、RAID 5、RAID 6、RAID 7、RAID 01、RAID 10、RAID 50、RAID 60。每種等級都有其理論上的優缺點，不同的等級在兩個目標間取得平衡，分別是增加資料可靠性以及增加記憶體（群）讀寫效能。\n再參考 筆記 RAID在實體上是多顆硬碟，在系統中被當作一顆硬碟使用，而在作業系統底下，也還是可以將它分割為單一或多個分割區。因此建立好的RAID，使用起來跟單一硬碟是完全相同的，只是依組成方式的不同。RAID可以提供更大的容量、更高的讀寫效能，或是額外的「安全性」。（這裡所說的「安全性」，是指硬碟損毀之後資料重建、回復的能力，與加密防駭等功能無關）\nCh12 File System Implementation File-System Structure File-System Structure 記憶體跟硬碟之間資料傳輸 I/O 的單位為 block 一個 block 可能有多個 sector 一個 sector 通常為 512 bytes 一個作業系統可以使用多個檔案系統 如 NTFS, FAT32 檔案系統設計的兩個主要的問題 與使用者程序的介面 (上層) 與硬碟的介面 (下層) Layered File System File System 實作上通常由以下三個部份組成 manages metadata: 找到 file 並提供 file handler logical \u0026lt;–\u0026gt; physical mapping: 將程序要讀取內容的位置轉換成 block 的位置 read d1, c73…: 轉換後 physical 的 hard-drive 及 block 位置\n對使用者而言，只有一個檔案系統的 Interface (FS manager) 存在，而 FS manager 會去呼叫檔案對應的檔案系統來執行\nFile-System Implementation On-Disk Structure(Structrue 要永久存在，所以一定要在 disk 上) Boot control block (per partition): 存放啟動作業系統相關資訊的 partition 通常為 partition 的第一個 block (若是空的代表沒有 OS) UFS (Unix File Sys.): boot block, NTFS: partition boot sector Partition control block (per partition): partition details details: blocks 的數量, block 的大小, free-block-list, free FB pointers 等 UFS: superblock, NTFS: Master File Table File control block (per file): 跟檔案相關的 details details: 權限, 大小, data blocks 的位置 (physical 的位置) UFS: inode, NTFS: stored in MFT (relational database) Directory structure (per file system): organize files\nIn-Memory Structure in-memory partition table: 每個被掛載的 partition 的資訊 in-memory directory structure: 最近存取的 directories 的資訊 system-wide open-file table: 保存每一個被開啟檔案的 File Control Block per-process open-file table: 記錄僅跟 process 有關的資訊，比如讀檔位置、開檔權限等，另外會有 pointer (file handler/descriptor) 指到對應的 system-wide table entry File-Open \u0026amp; File-Read 開檔時，會先去 directory structure 看檔案是否在記憶體中，若不存在則去硬碟把檔案的 directory structure 資訊讀進來，找到我們要的節點並指向 file control block，這樣就有了檔案的所有資訊 讀檔時，File handler 為 per-process open-file table 的某一個 entry，拿到 handler 確保檔案的確 open 之後，必須從 system-wide table 取得檔案的實際位置，才能從硬碟存取檔案內容\nFile Creation Procedure 作業系統配置一個新的 FCB 更新 directory structure OS 將對應的 directory structure 讀進記憶體中，檢查有無同名稱的檔案 將新的檔案名稱以及 FCB 更新進 directory structure (在檔案關閉後) OS 將 directory structure 寫回硬碟中 檔案出現在 user 的 directory command Virtual File System VFS 提供物件導向的方法實作 file system 對於不同檔案系統，VFS 使用同一個 system call interface VFS 依 partition info 呼叫適當的 file system routines 在 Linux VFS 中有 4 個主要的物件類型 inode \u0026ndash;\u0026gt; 單獨的檔案 (on disk) file object \u0026ndash;\u0026gt; 開啟的檔案 (檔案開啟後的操作物件) superblock object \u0026ndash;\u0026gt; 整個 file system (對應到 partition) dentry object \u0026ndash;\u0026gt; 單獨的 directory entry VFS 定義一系列需要實作的操作 int open(…) \u0026ndash;\u0026gt; 開啟檔案 ssize_t read() \u0026ndash;\u0026gt; 讀取檔案 Directory Implementation Linear lists (Linked list) 檔案名稱的串列，且有相應的指標指向 data blocks 容易實作但 performance 差 insertion, deletion, searching Hash table \u0026ndash;\u0026gt; linear list w/ hash data structure O(1) 搜尋時間 每一個 hash key 對應到一個 linked list，避免 hash collision hash table 通常有固定數量的 entry 數量\nAllocation Method Contiguous allocation 檔案在硬碟中的 block 擺放位置要連續 不需要 traverse 整個硬碟，只要簡單的計算就知道檔案在哪一個 block \u0026ndash;\u0026gt; 磁頭轉動的數量最小化 Directory entry 只要存 start 跟 length，非常簡單 無論是 sequential 或 random 的存取都可以有效率地實作 很容易有 External fragment 解法 \u0026ndash;\u0026gt; compaction 檔案不能隨意地增長 解法 \u0026ndash;\u0026gt; extend-based FS (跟 linked list 結合) Extent-Based File System 許多新的 file system 使用 modified contiguous allocation scheme extent 是一個硬碟連續的 blocks 一個檔案可以有一個或多個 extents 一個 extent 若用完了，系統會給檔案另一個 extent，利用 linked list 串起來 extents block 必須有一個 pointer 紀錄下一個 extent 的位置 缺點 Random access 的成本增加 (例如檔案在第三個 extent，必須要讀前兩個 extent 才知道第三個 extent 的位置，增加硬碟讀取的次數) 仍然有 internal \u0026amp; external 的 fragment\nLinked Allocation 檔案由一個 linked list of blocks 所組成 每一個 block 有 pointer 指向下一個 block 因為需要空間放 pointer，所以 block 中實際存放的大小為 block size - pointer size Directory 只需要存起始跟結束的 block id 建立新檔案時並不需同時就宣告檔案大小 缺點 只適合 sequential-access random access 需要遍歷 linked list 因為 link pointer 存放在 block 中，每次存取 block 硬碟都要讀取一次 需要 pointer 的空間 (4/512 = 0.78%) 解法：unit = cluster of blocks (把很多 blocks 組成一個大的 blocks，減少遍歷的長度) 會有 internal fragment 的問題 Reliability 只要遺失一個 link 等於整份檔案遺失\nFAT (File Allocation Table) file system FAT32 在 MS/DOS \u0026amp; OS/2 中使用 將 links 存成一個 table (所有檔案的 links) 每一個 table entry 大小為 32 bits 放在 partition 的起始點\nFAT (table) 通常會 cache 在記憶體中 Random access 的效率改善 硬碟只要讀取 FAT 就可以找到檔案 block 的位置 Indexed Allocation Example Diretory 擁有 file index block 的 address 每一個 file 有自己的 index block index block 儲存檔案資料的 block id 將所有 blocks 的 pointer 集中存在一個 block 中 優點 direct \u0026amp; random access 非常有效率 沒有 external fragmentation 很容易去建立檔案 (只要有 free list，就知道哪裡有空間放檔案) 缺點 需要額外放置 index 的 blocks，這些 blocks 只能放 index，空間被浪費掉 另一個問題是，當檔案太大，一個 index block 存不下時，那 index block 應該要多大？ linked scheme multilevel index combined（inode in BSD UNIX） Linked Indexed Scheme\n將 index blocks 用 linked list 串起來 適合 small to medium size 的檔案\nMultilevel Scheme (two-level) 第一階的 index block 儲存第二階 index blocks 的指標 第二階 index blocks 的指標才指向 file blocks 適合 large size 的檔案\nCombined Scheme: UNIX inode File pointer: 4B (32 bits) \u0026ndash;\u0026gt; 只能存放 4GB ($2^{32}$) 的檔案 可以讓不同大小的檔案，使用不同類型的 index scheme，提昇檔案讀取的效率 假設一個 block 的 entry 數量為 12，綠色因為每個 index blocks 還要存 2 個其他 index - blokcs 的 pointer，所以檔案大小乘上 $2^{10}$\nFree-Space Management Free-Space list: 紀錄所有硬碟中 free 的 blocks Scheme Linked list (same as linked allocation) Grouping (same as linked index allocation) Counting (same as contiguous allocation) 檔案系統通常用與管理檔案相同的方式管理 free space Bit vector Bit Vector (bitmap): 一個 block 一個 bit 來表示，0 為 free; 1 為 occupied 優點 簡單且快速 (硬體支援 bit-manipulation instruction) 缺點 為了效能必須存在快取中，當檔案很大時 bitmap 會非常大，超過快取的空間 例如一個 1TB(4KB block) 的硬碟需要 32MB 的 bitmap\nGrouping \u0026amp; Counting Linked List 所有的 free blocks 利用 linked-list 串在一起 將第一個 free block pointer 存在 disk 和快取中的特別位置 遍歷 list 效率低 可參考 FAT 的作法所有的 link-pointers 存在一個 table 當中 Grouping 與 linked-index allocation 一樣 將 n free blocks 的 address 放在 1st block 前（n-1） pointers 是 free blocks 最後一個 pointers 指向另一個 grouping block Counting 與 contiguous allocation 一樣 儲存第一個 free block 的指標和 contiguous free blocks 的數量 Ch10 Mass Storage Structure Disk Structure 硬碟被 addressed 為一維的 logical blocks 陣列 logical block 為最小的轉換單位，一個 block 有很多個 sector Logical block 以 sequential 的方式映射到硬碟當中 Sector 0 為最外圈 1st track 的 1st sector 從最外圈到最內圈\nSectors per Track Constant linear velocity (CLV) 每一個 track bits 的密度相等 外圈有更多的 sectors 保持相同的 data rate 所以內圈的旋轉速度要加快 應用： CD-ROM \u0026amp; DVD-ROM Constant angular velocity (CAV) 保持相同的旋轉速度 內圈的 bit density 較高 保持相同的 data rate 應用：硬碟 Disk I/O 硬碟逆用 I/O bus 跟電腦連接 EIDE, ATA, SATA (Serial ATA), USB, SCSI 等等 I/O bus 利用 controller 來控制 Host controller (computer end) Disk controller (disk drive 內建) Disk Scheduling Introduction Disk-access 時間主要分成三個部份 seek time: 將讀寫頭移到需求的環上 (因為移動磁頭是機械式的行為， seek time 是影響硬碟讀取時間最主要的成份，scheduling 要盡可能讓磁頭在讀取多個檔案時能沿著一個方向移動) rotational latency: 旋轉讀寫頭到需求的 sector 上 read time: 資料轉移的時間 Disk bandwidth bytes transferred/(完成最後一個請求的時間 - 開始讀取的時間) Disk Scheduling 最小化 seek time 處理硬碟 I/O 請求的算法 FCFS（first-come, first-served） SSTF（shortest-seek-time-first） 普遍使用，但不是最佳的算法，且可能有 starvation 的問題 適合 loading 輕的情況 SCAN 在高負載的情況下表現佳 沒有 starvation 的問題 C-SCAN（circular SCAN） SCAN 的延伸，讓等待時間更為平均 LOOK and C-LOOK FCFS (First-Come-First-Served) 對磁頭移動來說，只關心 track 的 ID 假設現在的 request queue 為 98, 183, 37, 122, 14, 124, 65, 67，Head pointer 為 53，總移動量為 640\nSSTF (Shortest-Seek-Time-First) SSTF 排程為 SJF 的一種，可能導致 starvation 的問題 總移動量為 236\nSCAN Scheduling 磁頭先往一邊走再往另一邊走 A.K.A elevator algorithm 各個請求被讀取的時間容易不平均 (ex: 若磁頭往左邊移動但新請求剛好再最右側) 總移動量為 236\nC-SCAN Scheduling 磁頭只往一個方向移動 同方讀到底之後，會直接回到另一頭 (Round-Robin) 各個讀取時間比 SCAN 算法更為平均 總移動量 382\nC-Look 會看是否有新的請求與目前磁頭移動方向同向，有的話繼續延該方向移動 若同方向沒有新的請求，則磁頭不會回到最開頭，會從另一個方向最靠近目前位置的請求開始 若決定好移動位置，但此時有個介於之間的請求進來 (如 53 -\u0026gt; 65，決定了之後 64 才進來)，必須要等到下一次才會被讀取\nDisk Management Disk Formatting Low-level formatting (or physical formatting): 硬碟出廠時，已完成格式化作業 將 disk （magnetic recording material）切分成數個 dist controller 可讀寫得 sectors 每個 sector = header + data area + trailer header \u0026amp; trailer 存放 sector 的數量及 ECC (error-correcting code) ECC 藉由所有在 data area 的 bytes 計算，用 trailer 的 ECC 檢查硬碟有無壞軌 data area size 通常為 512B, 1KB or 4KB OS 接著做以下兩個步驟來使用硬碟 將硬碟 partition 成一個或多個 groups of cylnders logical formatting (建立 file system) Boot Block Bootstrap program 初始化 CPU, registers, device, controllers, memory 並且啟動 OS 第一階段 bootstrap code 存放在主機板的 ROM (Read Only Memory) 完整的 bootstap 放在 boot block of boot disk (系統碟) Booting from a Disk in Windows 2000 執行 ROM 中的 bootstrap code 讀取 MBR (Master boot recode) 的 boot code 利用 partition table 找到 boot 的 partition 位置 讀取 boot sector/block 並繼續開機作業\nBad Blocks Simple disks like IDE disks 人工執行格式化程式來標記 bad block 對應的 FAT entry 壞軌的區域不允許用來 allocation Sophisticated disks like SCSI disks disk controller 會維護一個 bad blocks list List 在硬碟的生命週期會持續更新 Sector sparing (forwarding): 將壞軌區的資料 map 到備用的區域 可能會影響到 disk-scheduling 的表現 (Physical 位置不連續) 在硬碟 formatting 時，每個 cylinder 會留少數備用的 sectors Sector slipping: 若要避免 physical 位置不連續的問題，則必需將整個資料做搬移 Swap-Space Management Swap-space: 虛擬記憶體使用硬碟空間 (swap-space) 作為主記憶體的延伸 UNIX: 允許使用多個 swap spaces Location 一般檔案系統的一部分 (e.g. NT) 效率較差 獨立的 partition (raw partition) 效率較好 但 Size 固定 允許上面兩種方式 (e.g. Linux) Swap Space Allocation 1st version: process 創建時放在記憶體，並複製一份完整的內容到連續的硬碟空間。主要問題是所有內容都複製，造成空間浪費 2nd version: 只複製要被 swap 的 pages 到 swap space Solaris 1: text segments(程式碼) 可以從檔案系統讀取，所以當 swap out 的時候直接捨棄 只有 anonymous memory (stack, heap, etc) 這些動態配置的記憶體空間，在虛擬記憶體創建時，會存到 swap space Solaris 2: 更進一步只有當動態配置的記憶體空間需要被 swap out 時，才動態配置 swap-space，而非虛擬記憶體創建時就建立副本\nRAID RAID (Redundant Arrays of Inexpensive Disks) 用多個便宜的硬碟組成 利用 redundancy 提昇可靠度 藉由 parallelism 提昇效能 RAID 排成不同 levels Striping: 將檔案切割放到多個硬碟上 Mirror (Replication): 備份 Error-correcting code (ECC) \u0026amp; Parity bit: 產生 redundant 的 code 來做 Error detection 甚至檔案修補 RAID 0 \u0026amp; RAID 1 RAID 0: non-redudant striping 透過平行讀取增加效率 I/O 的 bandwidth 與 striping 的數量成正比 若有 N 顆硬碟，則讀寫的頻寬提昇 N 倍 RAID 1: Mirrored disks 藉由 redundancy 提昇可靠度 讀取的頻寬與硬碟數量成正比 寫入的頻寬保持不變，甚至比單顆硬碟還差一些\nRAID 2: Hamming code 以 Hamming code 將資料編碼後分割成獨立的位元 在資料中加入錯誤修正碼 e.g.: Hamming code(7, 4) 4 data bits (在 4 個 disks 上) + 3 paritu bits (在 3 個 disks 上) 每一個 parity bits 為 3 個 data bits 的線性編碼 當有一個 disk 失效時，可以復原資料 可以偵測到兩個 disks(bits) 的錯誤 但只能還原 1 bit 的錯誤 比 RAID 1 更好的空間使用率 (RAID 1 100% redundancy v.s. RAID 2 75 % redundancy)\nRAID 3 \u0026amp; 4: Parity Bit 雖然 RAID 2 可以偵測硬碟錯誤，但 disk controller 就能夠偵測 sector 的讀取是否正確 因為 low level 的 controller 會提供哪個 sector 壞掉，所以 1 個 parity bit 就足夠修正 1 個 disk 的失效 RAID 3: Bit-level striping; RAID 4: Block-level striping 優點是更好的空間使用率 (33% overhead) 缺點是計算與儲存 parity bit 的 cost\nRAID 4: 因為 controller 不需要從多顆硬碟重建 block，有更高的 throughput RAID3 一個 byte 會跨多顆硬碟，速度取決於最慢的那個 bit; 而 RAID 4 可以一次從單顆硬碟讀取多個 bits 的資料\nRAID 5: Distributed Parity RAID 2~4 都把 parity 集中在單獨的一群硬碟中，對使用者來說這些硬碟等於不存在 RAID 5 則將資料及 parity 放在一起 可以避免過度使用單一顆硬碟 RAID 3 \u0026amp; 4 讀的時候可以平行處理，但寫的時候因為 parity bits 集中擺放，等於只有一顆硬碟的效率\nRAID 5 讀取的 BW 增進 N 倍 RAID 5 寫入的 BW 法一: 讀取所有未變動的資料 (N-2) bits, 重新計算 parity bit, 將變動及 parity bit 寫回硬碟 BW = N / ((N-2) + 2) = 1 倍 \u0026ndash;\u0026gt; 完全沒變 法二: 只讀取變動及 parity 的 bit, 利用更新前後的差異計算新的 partiy, 將變動及 parity bit 寫回硬碟 BW = N / (2+2) = N/4 倍 \u0026ndash;\u0026gt; 有加速效果 RAID 6: P+Q Dual Parity Redundancy 類似 RAID 5, 但儲存更多的 redundant 資訊來防止多顆硬碟失效的情況 使用 ECE code (i.e. Error Correction Code) 而非 single parity bit Parity bits 通常也 strips 到多顆硬碟中 複雜度及 overhead 高，除非資料真的很重要，一般不會採用這種實作\nHybrid RAID RAID 0+1: Stripe then replicate RAID 1+0: Replicate then stripe\nReferences 周志遠教授作業系統 周志遠教授作業系統講義 作業系統 Operating System 筆記 Operating Systems Course Notes Main Page 作業系統OS Operating System Concept 9th edition Mr. Opengate. MIT6.828 Operating System Engineering https://hackmd.io/@YiZjennnnn/process_scheduling MarkDown語法大全 ","date":"2023-06-13T00:00:00Z","image":"https://www.d0ngy3.com:443/p/os/title_hu_945a1b26ec79d1a2.jpg","permalink":"https://www.d0ngy3.com:443/p/os/","title":"作業系統 Operating System"},{"content":"Leetcode刷題學習筆記\u0026ndash;心得統整 面試reference 面試準備 軟體工程師求職 (1)履歷撰寫 軟體工程師求職 (2)公告於市 軟體工程師求職 (3)面試準備 軟體工程師求職 (4)面試工具篇 分享技術部落格: 酷殼 中年找工作心得 軟體職缺準備心得 ptt salary 轉職面試心得 - 歐美、中國、台灣工作 刷code心得 LeetCode高效刷題心得分享 COVID期間拿到Google FB 微軟 Offer Part3 面試分享 Google/MS/Amazon/Roku Google TW SWE 面試心得（上） Google TW SWE 面試心得（下） 0到100的軟體工程師面試之路 程式語言面試考題集錦 薪資比較 薪資透明化 levels.fyi 推薦題庫 Blind Curated 75, (我的整理) Leetcode 题解 花花酱 LeetCode Problem List 题目列表 Leetcode 101 NeetCode 150 Grind 75 questions 解題網站 Grandyang 花花酱 wisdompeak 教學網站 LABULADONG 的算法网站 LEARN C++ 面試時的反問 面試時的反問 資訊科技產業專案設計(2021年秋季) 課程進度表和公告 作業1 Repeat: 重複提問，確認自己理解原本的要求 Examples: 針對題目條件，舉出符合的案例，不限於特例 Approach: 說明自己打算採用的方案 Code: 撰寫程式 Test: 若不能實際測試，那說明驗證程式的方案 Google Tech Dev Guide 超牢記憶法Make It Stick 努力回想才是記憶的關鍵（retrieve檢索） 奮力回想(從題目到解答自己做一次) 不要重複翻閱(不要只看code不動手做，試著回想解答的流程) 穿插式練習(同時練習好幾種類型的題目) 將練習當成比賽，才能把比賽當成是練習。 每天回想學習過的東西，不能拿出筆記來參考 費曼學習法(把學過的東西給12歲小孩聽得懂，看見事物的原始結構) 找一個好的教練（簡答題考試） 當一個在某個領域越不擅長時，就越容易高估自己的能力。 花幾分鐘為幾天後自己出一張考卷(周末把一個禮拜的每日精選做一次) 考試的時機點，在大腦開始遺忘，但還沒完全遺忘之前。(隔天)(每天選一題隔天再做一次) {%youtube k-MOeKIkvfs %}\n演算法\nRecursive 把問題切成相同的小題目。 Tree Traversal 分為pre-order, in-order，post-order和level-order，可以使用DFS或BFS. Depth-First-Search/Breadth-First-Search 依深度或是廣度瀏覽所有的資料 Dynamic Programming 通常是求maximal或是minimal或是幾種方法的時候會用到。 Divide and Conquer 將題目分成一樣的小題目，最後將結果合併起來。 Binary Search 在排序過的資料中，尋找目標值。用二分法找效率為O(logN)。 Two Pointers 通常為array中，使用前後兩個pointer來比較資料。 Fast Slow Pointers 在linked-list中使用快慢pointer來解決問題。 Combination 在所有的組合中，找出最佳的答案。 Sliding Window 需要找出連續資料的關聯性。ex. substring, subarray. Backtracking Sort algorithm Selection/Bubble/Insertion/Heap sort Bucket Sort 把數字分成一個一個的區段，ex: [0] : 09, [1] : 1019, [2] : 20~29 Counting/Radix Sort Greedy + heap 如果問題是詢問max或是min，最直覺的解法就是依序把最大或是最小的數值相加，但是有時候必須刪減就是用heap提供的數值。 Greedy 每次都把目前的狀態update到最有利的狀態。 資料結構\nSet 只能儲存value，必把value當成key。 Map 把資料做成key-value的對應，可以快速找到key對應的value。或是使用==客製的key==來對資料做統計。 stack [後進先出] 利用後進先出的特性，可以解決pair的問題或是反轉的效果。兩個stack也可以組成不同的特性。 Queue 先進先出，可以用在BFS。使用BFS通常可以解決最小數量的問題。 monotonic stack 一樣是stack，但是stack的內容有照一定的順序排列。遞增或遞減。找出前後比自己大或小的element。 Binary Search Tree(BST) 他是一個binary tree，但是準守著左邊的node小於root, 右邊的node大於root。 Graph 有向圖和無向圖。 Disjoint set/Union Find 使用root array來紀錄每個vertex的root或是parent node Minimal spinning tree 最小weight和，可以把全部的node連起來的tree，通常使用greedy演算法，==每次都從最小的weight開始選，如果沒在graph裡面就加進來。== Single Source Shortest Path Algorithm Dijkstra 類似BFS，但是使用priority_queue來取最小weight路徑。 Shortest Path Faster Algorithm(SPFA) 使用vector和queue來記錄從source到每個node的最短路徑。可用在negative weight。 Topological sorting 走訪有相依性的圖。 Trie 統計字串或是數字的bit Priority_queue 統計最大最小值的出現。 Binary Index Tree(BIT) 計算range sum可以達到 update是O(logN)，getSum也是O(logN) 使用prefix sum只能達到 update是O(N), getSum是O(1) 使用array sum 只能達到 update是O(1), getSum是O(N) 其他\nMath數學解法 有些時候分析完題目，發現用數學解反而更精簡。 Randomized 選取element並且每個的機率都一樣。 Bit Manipulation 對bit做處理。 加法器設計 prefix sum prefix_sum[i] = sum(nums[0:i - 1]); 前i個的和，適合用來解區段sum的題目。 subset sum 把一個數列分成若2個subset，求出兩個subset的特殊 關係。例如sum(s1) = sum(s2) 或是 sum(s1) - sum(s2) = target等等。 Interval 使用[start, end)來表示一個區間。 Line Sweep 依序掃描x或是y，來得到答案。 解題技巧\n小技巧/code snippet\n關鍵字/keyword\nC++API/STL整理\nC++ Operator Precedence\nLearn C++\n名詞解釋\nTime/Space Complexity\n面試題目整理 公司_職稱 面試題目： 1 2 流程：\n1.\n2. 出處：面試 聯發科_軟韌體職缺 面試題目：\n選擇與填充題 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 1. Global 直接宣告參數不給值 跟function 裡面宣告參數不給值 直接印會印出什麼XDDDDD 2. 兩個 String還是Char陣列 分別丟同樣的字串 問如果直接 = =會有什麼樣的結果 true,false或不能編譯 3. SWAP( int*a, int*b){ temp=a; b=a; b=temp;} 問：丟10和20進去求output 覺得有點怪怪的應該都是10吧(x 4. a) int a; // An integer b) int *a; // A pointer to an integer c) int **a; // A pointer to a pointer to an integer d) int a[10]; // An array of 10 integers e) int *a[10]; // An array of 10 pointers to integers f) int (*a)[10]; // A pointer to an array of 10 integers g) int (*a)(int); /* A pointer to a function a that takes an integer argument and returns an integer*/ h) int (*a[10])(int); /* An array of 10 pointers to functions that take an integer argument and return an integer*/ 這題型感覺算重要，有舉出一個考 5. 有考extern用法 印象有點模糊 但記得有全域跟區域還有加上extern宣告的x問會輸出哪個值 a丟20之類求output int x= 10; //global void func(int a) { int x = 15; if (a\u0026gt;10) extern int x; cout\u0026lt;\u0026lt; x ; } 6. C裡面的memory 程式段(.text)主要存放程式的機器碼， 資料段(.data)則是存放全域變數的資料， BSS 段(.bss)存放的是未初始化的全域變數， 堆積段(.heap)程式使用 malloc 進行記憶體分配時，可以分配的動態記憶空間 堆疊段(.stack)則存放「參數、函數返回點、區域變數、框架指標」等資料 有出多選題問Stack裡面放什麼資料 感覺算常考建議詳細再上網多查QQ 7. Macro的陷阱題 這題真的太精彩了看到的時候笑了出來XDDD 跟我之前去聯發科參加活動時的題目完全一樣 #define INC(x) x*=2; x+=1 for(i=0,j=1;i\u0026lt;5;i++) INC(j); 求j =? 答案是33 據說答對率3% XDDD 上機考 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 有提供Library可以查 上機考得我覺得算簡單 第一題就SWAP不過要用bitwise void swap(int *a, int *b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; } 第二題稍微難了一點點 系統會給一個陣列大小n 跟一串陣列 你要找出連續加起來最大值跟其數字 比方說給 6 [1, 2, -1 ,3, 0, 1] 那你就要output連續最大值是3+0+1=4 跟[3,0,1] An integer array is given. The system gives you a series of integers, and please find it as a correct position in the sequence then print the corresponding value.\n1 2 3 4 For example: arr = [5, 8, 4, 9, 1] is given Please find the position 2 , 1, 3 , 4, 0in this array Print: 5, 4, 8 , 9 , 1 簡單來說就是sort之後query 就ok了\n流程：\n筆試14題(C/C++)，包含填充題跟選擇題 \u0026amp; 兩題上機考, 共50分鐘C語言考蠻多東西，例如 function pointer, static, global, volitile, macro, C++ template 個人自我介紹(使用精美ppt做簡報)，在過程中盡量把你自己負責過的專案做個簡單扼要的說明，尤其是你負責的部分，這很能提起面試官的興趣，這邊我有跟面試官討論一下平行化該怎麼做比較好，他給了我一個沒想過的答案 面試官提問攻擊，你負責接下攻擊並反擊，可能包含了你剛剛報告的內容，資料結構，作業系統，計算機概論… etc.我個人被問到 dead lock, synchronization, critical section 白 板 題！！！面試官看我有記錄一些LeetCode題目在github上，他就挑了兩題(1) Are two trees equal (2) Reverse LinkedList ~~(面試官: 我知道你比較熟Python，但現在你當然要用C寫)~~~ 面試官說明工作內容 \u0026amp; 你的提問時間 出處：聯發科 面試心得分享、新竹聯發科軟韌一面\n聯發科_4G工具軟體工程師 面試題目： 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1. ask: the value of v? unsigned long v1 = 0x 00001111; unsigned long v2 = 0x 00001202; unsigned long v; v = v1\u0026amp;(~v2); v = v | v2; 2. ask: the value of *(a+1), (*p-1)? int a[5] ={1,2,3,4,5}; int *p = (int *)(\u0026amp;a+1); 3. Re-write void(*(*papf)[3])(char *); typedef__________; pf(*papf)[3]; 4. Explain lvalue and rvalue. 流程：N/A 出處：wubui MTK 面試心得分享 群暉科技_軟體工程師 面試題目： 1 1 2 3 4 5 6 7 8 9 1. 講解一下 Process 及 Thread 的差別跟比較： 2. Stack 跟 Heap 的差別： 3. 請解釋一下 Virtual Function： 4. 請解釋一下 Synchronous call 跟 Asynchronous call 的差別： 5. 比較 Stack 跟 Queue 的差別 =\u0026gt; 實作一下 Stack。 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1. pointer操作、pointer/reference的差別與實作 2. 最短路徑演算法等等圖論的東西 3. 找出array中重複的數字 4. 動態擴充的stack和queue實作 5. Multi-Process / Multi-Thread之間的同步與溝通問題 6. Virtual Memory的觀念、Page Fault、LRU演算法 7. 算樹的高度、節點數量、BFS/DFS 8. Linked-List相關的題目（排序、插入等） 3 1 2 3 4 1.實做f(n) = 1-2+3-4...+/-n 2.實做矩陣相乘，如[3*4] * [4*2] = [3*2]的矩陣 3.給你一binary tree,求樹高、節點數 4.解釋const、static、volatile、程式在記憶體中的配置-\u0026gt;stack與heap 4 1 2 3 4 1.什麼是OS 2.講解一下 Process 及 Thread 的差別跟比較 3.講解一下如何避免 Race Condition 4.講解一下什麼是 Hazard 5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 1. 在嵌入式平台上面使用過哪些Linux tool、Debug tool、Profiling tool 2. 你說你使用過perf 效能分析工具，那它的原理是什麼，為什麼可以作到。 3. 請講一下你用過GDB的什麼功能，用來解決什麼問題。 4. 在嵌入式平台上開發跟在一般PC上開發有什麼不一樣和要注意的地方。 5. TCP/UDP差別在哪，用途？Socket程式大概怎麼寫？（三向交握那些） 6. Client和Server在做網路通訊時，recv buffer包含了什麼資訊。 7. Critical section是什麼？（之後我提到了Mutex） 8. Mutex程式大概怎麼寫？撰寫時有什麼要注意的地方？ 9. Process 和 thread 差別？如果是不同process，如何保護Critical section？ 10. 有沒有寫過shared memory，大概怎麼寫，寫的時候要注意什麼。 11. 原本好像要問我fork()，不過之後不知道為什麼就沒問了 12. 講講虛擬記憶體和分頁機制。 13. 現在有兩個整數集合要進行差集，怎麼寫？為什麼用這種資料結構？有沒有更快的方法？時間和空間複雜度各是多少？（我舉了array、linked list、binary search tree、hash table的實作方式） 14. 解釋對稱式和非對稱式加密，為什麼他們可以運作，如何運作。 15. 公鑰跟私鑰的差別跟用途？數位簽署的原理？ 16. Linux 系統如何儲存使用者密碼。 17. 為什麼能確保加密資料不會被字典攻擊。 18. 講講SQL injection 跟XSS 攻擊。 19. 為什麼宣告並初始一個超大陣列會crash，而宣告成static就不會，他們的儲存方式有什麼差別。（之後我有講到stack、heap、global） 20 .stack 和 heap差別是什麼。 21. function在進行呼叫的時候OS會作什麼事情，組合語言大概怎麼寫。 22. 白板題：給定一個數列和一個數字，請寫出partition的程式，左邊小於此數字，右邊大於等於此數字，要確保所有特殊數列都能通過測試。 23. 白板題：順時鐘旋轉一張 NxN 的灰階圖片，不可以使用額外的二維陣列。 流程：N/A 出處：面試 群暉科技_研替 面試題目： 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 OS相關的問題: 1.process, thread的差異 2.shared memory 3.mutex, semophore 4.paging 5.dll如何運作 data structure/algorithm相關的問題： 1.(不用寫code） 給兩個set A,B. 想輸出A - B要怎麼做？複雜度呢? 2.(不用寫code) 描述一下經典算法LCS怎麼做的 3. 講一下array, linked list, tree的優缺點, 以及使用時機 Coding 題： 1.給你一個BST的struct 結構，寫出insert操作 2.給你一個N bit的數字，輸出他有幾的bit是1 3.給你一張圖，寫一個function參數是起點跟終點，找出最短路的長度 4.追加問題：那如果我想印出這條path有辦法嗎? \u0026#34;你要不要描述一下你印象最深刻的project是什麼?\u0026#34; \u0026#34;為什麼是這個?\u0026#34; \u0026#34;那你們怎麼分工的?\u0026#34; \u0026#34;這個project裡最有印象的是哪一份code?是做什麼的?\u0026#34; \u0026#34;你寫過的code以來，最難debug的code是怎樣的?\u0026#34; 流程： 進來一位RD, 看起來很活潑可愛XD 首先請我簡單自我介紹一下 聊聊我的論文寫了些什麼 進來一位主管，笑容滿面XDD 問了我最近有沒有什麼興趣，我說我最近喜歡在coursera上看ML的課程 然後就開始跟我聊ML了！ \u0026lt;\u0026ndash; 自爆的下場XD 聊到paper的部分也是讓我介紹一下，為什麼會找這個題目， 跟別人有什麼不一樣，複雜度部分好了多少之類的 (第二天的面試) 進來的是人資姊姊 這是我覺得面試到現在最煎熬的一關XD 人資姊姊的問題都是偏向個性，人格特質相關的問題 進來的是一位RD 跟我聊聊履歷上project的內容 做的過程是如何分工的 有沒有遇到什麼樣的困難 (之前跟別人聊過，這一關通常是講一下你有沒有offer 薪水，公司狀況，給你問問題之類的) 進來的人遞了張名片給我，是位經理 然後，他就開始問我問題了XDDDDD 最後面試結束後閒聊及介紹公司 出處：[心得] 群暉面試 研替 趨勢科技_研替 面試題目： C/C++ 考題 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 1. 搜尋 List 的時間複雜度 (10%) 搜尋 Binary Tree 的時間複雜度 搜尋 Hash Table 的時間複雜度 2. 一段程式要你判斷 output value。 (15%) Class A { A(){print();} virtual print(){cout \u0026lt;\u0026lt; “in A”\u0026lt;\u0026lt;endl;} }; Class B: public A{ B(){print();} virtual print(){cout \u0026lt;\u0026lt; “in B”\u0026lt;\u0026lt;endl;} }; void main(void) { B b ; } 請問輸出為何 (選擇題) 3. 給一段程式碼裡面包含一個 function(string *path) 此 function 的目的為 將 Path 字串最尾端的”\\\\”刪除,然後問此段程式碼有何問題。(25%) 4. Link List 反轉, 不能使用任何額外記憶體 (25%) 5. 寫一個函數, int findPosition (Node *root, int value),root 為一個 二元搜尋樹, value 為 Node 的鍵值,這函數要回傳 value 在二元搜尋樹的中序追 蹤為第幾個。 QA 考題 1 2 3 4 5 6 7 8 9 10 1. 有個人每年牙齒檢查時,都會發現自己有長蛀牙的牙洞,有一年檢查卻發現突然 沒有任何牙洞了,但下一年卻發現一個超大的牙洞請問可能的原因為何 (選擇題) 2. 網路 10.xxx.xxx.xxx/23, Gateway IP address 為 10.xxx.xxx.254, 問你以下哪些IP的封包會經過Gateway? 3. 如果要你測試捷運的驗票機, 你會如何測試? 4. 利用 Remote Desktop 或 SSH 連接到遠端主機A, 結果遠端主機A卻連不上另 一台 Server B 的網頁, 請問你如何找到連不上那一台Server B網頁的原因? 流程： Codility測驗個人覺得三題Medium，沒有像LeetCode上Easy可以10行以內完成，但是三題有2個小時，個人覺得時間算是很充裕，做完時還有30分鐘提早交卷。一面完有問考官成績，結果只拿66分，著實是有點慘，不過他覺得Qualified，更重要的是一些經驗。\n一面考官十分和善，應該是部門主管，開始先做一些簡單的自我介紹，之後便開始問一些簡單的問題，類似BFS.DFS是什麼，如何實做，有沒有用過Multi-thread等等。\n二面也是Peer Interview由一名工程師加上一面的考官旁聽，二面考的偏Python \u0026amp; Design Pattern，剛好這兩個我都沒準備，所以個人覺得回答慘兮兮，Python主要是他會給幾段code，負責回答哪裡有問題，以及一些東西的實作會怎麼去做，Design Pattern考的滿簡單像是Factory, singleton不過個人完全沒涉略，所以完全答不出來，但是OOP的問題都有回答。\n出處：趨勢科技筆試和考題、趨勢面試心得分享 Google_Software Engineer in Test 面試題目： 1 1 2 3 4 5 6 7 8 9 10 11 1.Efficiently implement 3 stacks in a single array. 2.Given an array of integers which is circularly sorted, how do you find a given integer. 3.Write a program to find depth of binary search tree without using recursion. 4.Find the maximum rectangle (in terms of area) under a histogram in linear time. 5.Describe recursive mergesort and its runtime. Write an iterative version in C++/Java/Python. 6.How would you determine if someone has won a game of tic-tac-toe on a board of any size? 7.Given an array of numbers, replace each number with the product of all the numbers in the array except the number itself *without* using division. 8.Create a cache with fast look up that only stores the N most recently accessed items. 9.How to design a search engine? If each document contains a set of keywords, and is associated with a numeric attribute, how to build indices? 10.Given two files that has list of words (one per line), write a program to show the intersection. 11.What kind of data structure would you use to index annagrams of words? e.g. if there exists the word “top” in the database, the query for “pot” should list that. 流程：N/A 出處：140 Google Interview Questions 瑞昱 面試題目： 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 Q1: 不能用if 和 switch case , 請用你認為最快的方法實作main extern void func1(void); extern void func2(void); extern void func3(void); extern void func4(void); extern void func5(void); void main(int n) { if n==1 execute func1; if n==2 execute func2; if n==3 execute func3; if n==4 execute func4; if n==5 execute func5; } Q2: 不使用if, 請用你認為最快的方法實作main extern void func1(void); extern void func2(void); extern void func3(void); extern void func4(void); extern void func5(void); void main(int n) { if n==33 execute func1; if n==67 execute func2; if n==324 execute func3; if n==231 execute func4; if n==687 execute func5; } Q3: Explain \u0026#34;#error\u0026#34; Q4: Explain \u0026#34;struct\u0026#34; and \u0026#34;union\u0026#34; Q5: Explain \u0026#34;volatile\u0026#34;. Q6: the value of v? unsigned long v1 = 0x00001111; unsigned long v2 = 0x00001212; unsigned long v; v = v1 \u0026amp; (~v2); v = v | v2; Q7: the value of *(a+1), (*p-1)? int a[5] = {1, 2, 3, 4, 5}; int *p = (int*)(\u0026amp;a+1); Q8: write a code a) set the specific bit b) clear the specific bit c) inverse the specific bit (0-\u0026gt;1; 1-\u0026gt;0); Q9: Re-write typedef _____; void(*(*papf)[3](char *); pf(*papf)[3]; Q10: write a code that check the input is a multiple of 3 or not without using division or mod Q11: Explain lvalue and rvalue Q12: 寫一個 function 可傳入正整數參數 N，回傳 1 + 2 + 3 +…+N 的和 Q13: reverse a string Q14: reverse a linked list Q15: 下面是一個 union ，請問要參考 ival 的值語法為何 ? Q16: 寫一個“標準”巨集MIN ，這個巨集輸入兩個參數並返回較小的一個。 Q17: Write a code to swap integer a, b, without temporary variable. Q18: Write a MARCO to calculate the square of integer a. 流程：N/A 出處：學長留下的考古題 普安科技_軟韌體工程師研替 面試題目： 1 1 2 3 4 5 6 1.data size 2.struct and union 3.利用c語言，將字串＊str2接序在*str1後 4.解釋deadlock、Race conidtion 5.write a program :copy 4,5,6,7bits of 0x1234567 to 0x145678f 1,2,3,4 bits 6.stack point跳轉到function需要哪些暫存器 流程：N/A 出處：2017Homework1-整理面試題目 ","date":"2022-12-17T00:00:00Z","image":"https://www.d0ngy3.com:443/p/interview/title_hu_3feb75f8983c6b32.jpg","permalink":"https://www.d0ngy3.com:443/p/interview/","title":"面試"},{"content":"力學 tags: NOTE 速度數學式: 平均速度 $$ \\vec{v} = \\dfrac{\\vec{S_1}-\\vec{S_2}}{{t_1}-{t_2}} = \\dfrac{\\Delta\\vec{S}}{\\Delta t} $$\n瞬時速度 $$ \\vec{v} = \\lim_{t \\to 0} \\dfrac{\\Delta\\vec{S}}{\\Delta t} = \\dfrac{d\\vec{S}}{dt}$$\n加速度: 平均加速度 $$ \\vec{a} = \\dfrac{\\vec{V_1}-\\vec{V_2}}{{t_1}-{t_2}} = \\dfrac{\\Delta\\vec{V}}{\\Delta t} $$\n瞬時加速度 $$ \\vec{a} = \\lim_{t \\to 0} \\dfrac{\\Delta\\vec{V}}{\\Delta t} = \\dfrac{d\\vec{V}}{dt}$$\n等加速度直線公式: $$ a=\\dfrac{V-V_0}{t}\\implies V=V_0+at $$\n$$ S=(\\dfrac{V+V_0}{2})\\times t = (\\dfrac{V_0+V_0+at}{2})\\times t \\implies V_0t+\\dfrac{1}{2}at^2 $$\n由 1. 可知 $t=\\dfrac{V-V_0}{a}$帶入2.\n$$ S = V_0(\\dfrac{V-V_0}{a})+\\dfrac{1}{2}a(\\dfrac{V-V_0}{a})^2=\\dfrac{V^2-V^2_0}{2a}\\implies V^2 = V^2_0 + 2aS $$\n曲線運動 角位移 $\\theta$ ：質點繞一軸旋轉所繞經的角度，單位 $(rad)$ 。路徑長度 $S=r\\theta$\n角速度 $\\omega$ ：單位時間內角位移的變化量，單位 $(rad/s)$ 。 $\\omega=\\dfrac{\\Delta\\theta}{\\Delta t}$\n角加速度 $\\alpha$ ：單位時間內角加速度的變化量，單位 $(rad/s^2)$ 。 $\\alpha=\\dfrac{\\Delta\\omega}{\\Delta t}$\n切線速度 $V_t$ ： $V_t=r\\omega$\n切線加速度 $a_t$ ： $a_t=r\\alpha$\n法線加速度 $a_n$ ：沿法線方向的速度 $a_n=\\dfrac{V^2}{r}=r\\omega^2$\n合成加速度 $a$ ：切線加速度與法線加速度之合成 $a=\\sqrt{a_n^2+a_t^2}$\nhttps://www.engineer4free.com/statics.html\n","date":"2022-08-30T00:00:00Z","image":"https://www.d0ngy3.com:443/p/mechanics/title_hu_bbee05174f358a18.png","permalink":"https://www.d0ngy3.com:443/p/mechanics/","title":"力學"}]