一、進程的建立1.系統調用clone()與fork()的區別: 資源的繼承方式參數區分父進程與子進程的方法fork()全部複製,即父進程的所有資源全部通過資料結構的複製傳給子進程無參數父進程與子進程,從fork()返回時的傳回值不同,以此區分二者。子進程返回0.父進程返回子進程的pidclone()有選擇地將資源複製給子進程,沒有複製的資源通過指標複製的方式與子進程共用(共用與複製的關係見2)有參數,用於設定資源複製的方式clone()所產生的子線程的PID有可能是0,因此採用比較系統堆棧指標的
除了分段管理中的LDT和GDT有較大改動,分頁管理中增加了三級分頁模型以外,大部分內容可以參考Linux0.12-記憶體定址一、分段管理:1.Linux中,段基址總是0,邏輯地址與線性地址是一致的。或者說,在Linux中,沒有實際上地使用分段機制2.一個進程可以使用一個GDT和一個LDTGDT包含:(1)LDT在GDT中的描述符(2)3個局部段描述符(3)3個與進階電源管理相關的段(4)5個PnP的BIOS服務程式相關的段(5)1個特殊的TSS段(6)1個任務狀態段TSS(7)核心態和使用者態的
10-1 列表之間的比較 未排序的單鏈表已排序的單未排序的雙鏈表已排序的雙鏈表SEARCH(L, k)nnnnINSERT(L, x)1n1nDELETE(L, x)nn11SUCCESSOR(L, x)1111PREDECESSOR(L, x)nn11MINIMUM(L)n1n1MAXIMUM(L)nnn110-2
童鞋們應該對“列印星形圖案”的編程題記憶猶新吧? 那就像我們的編程童年一樣的美好。 列印邊長為 n 個菱形, HO, 有的人立馬就刷刷刷寫出來了: package patterns.interpretation;public class FigurePrinting {/** * 根據給定 n 值列印菱形圖案 * @param n 菱形的邊數 */public void printDiamond(int n){if (n < 2) {throw new
1.schedule():選擇系統中下一個要啟動並執行進程(1)迴圈檢測就緒隊列中的每個任務 若任務的逾時定時器逾時 && 狀態為可中斷睡眠,則逾時計時器清0,狀態置為就緒 若任務的定時器到期,則定時器清0,SIGALARM訊號置位(定時器!=逾時定時器) 若任務除了阻塞訊號外還有其它訊號 && 狀態為可中斷睡眠,則狀態置為就緒(2)選擇counter值(剩餘執行時間)最大的任務
一、 緣起 看到CSDN社區有篇《3秒搞定一億資料的前K個最大值》, 想想堆排序不是可以用來做這事嗎,於是就動手做做,看看堆排序能夠達到怎樣的效率。堆的原理就不多說了,網上有好多, 如果想參閱比較權威性的材料,可參見《演算法導論》第六章堆排序。 本文的程式即是建立其上。 二、 程式 KthMax.c/* * 使用堆排序求解前K個最大值問題 * */ #include "HeapUtil.c" /* 計算 list 中前 k
一、什麼是訊號1.訊號是很短的訊息,可以被發送一個進程或一個進程組,用於進程間的通訊2.訊息的內容通常是一個數,這個數用於標識訊號訊號的接收方一定是進程,發送方可能是進程,或者核心。訊號只能發送給屬於同一session以及同一個使用者的進程3.訊號的種類可分為兩類(1)常規訊號:編碼範圍1-31,如果一個常規訊號被連續發送多次,會被合并成一次,即只有一個發送到接收進程(2)即時訊號:編碼範圍32-64,它們必須被排隊,以便發送的多個訊號都被接收到(3)常規訊號和即時訊號,都是用隊列來接收的,只是
主要流程與方法: STEP0. 瞭解系統的整體設計及概念 優秀的系統通常會有一個優雅的整體設計, 由一組簡潔的概念串聯起來。 最好首先瞭解系統的整體架構和所基於的概念, 會對理解系統的構造與運行有一個總體的引導作用。STEP1. 熟悉項目程式碼群組織結構 優秀的開源項目通常會有清晰而有層次化的項目組織圖。 拿到項目原始碼, 第一件事:概覽項目組織圖, 弄清楚哪些主要模組(包), 各個模組(包)
1.sys_brk(新邊界的線性地址)(1)地址檢查,地址不低於程式碼片段的終點(2)與頁面大小對齊(3)新地址 < 老邊界 -----> 釋放空間(見2) 新地址 > 老邊界 -----> 申請空間(見8)2.釋放空間(1)線性地址 -> 區間地址(2)預備一個新的區間結構(回收一個區間的一部分,可能導致一個區間變成兩個區間)(3)把所有涉及到的區間移到一個暫存佇列(4)解除映射,釋放頁面(見3)(5)對vm_area_struct和mm_struct作出調整(
一、實體記憶體的分配1.Linux2.6支援非一致記憶體訪問(NUMA),被分為一節點,每一個節點內是UMA80x86系統不使用NUMA,因為只有一個節點每個節點分為3個管理區:ZONE_DMA , ZONE_NORMAL ,
/*二維費用背包-完全背包費用1是忍耐值,費用2是殺怪數量(不用輸入,都是1)因為每個怪都可以殺無限個,所以是完全背包,調用模板即可*/#include "Bag2D.h"#include <iostream>using namespace std; int main(){int n,m,k,s,i,j;while(cin>>n>>m>>k>>s){//n:所需的經驗值V1 = m;//m:保留的忍耐度N = k;//k:怪的種類數V2
程式員是一個喜歡追究細節的種族。 細節到什麼程度? 細節到影響到快取命中的位元組對齊問題。 然而: 既要有細節思維, 又要有整體性設計思維, —— 創造可維護性強的軟體時, 實現的一致性和統一性尤為重要; 但是, 程式員容易陷於技術性思維, 不太善于思考更高層目標。 考慮下面兩個詞: “閱讀原始碼” 和 “解構軟體”。 ----------------------------------------
1.快取描述符、slab描述符、資料結構對象之間的關係slab描述符也可以在外面不管slab描述符在哪裡,空閑連結數組緊跟在slab描述符後面第一張圖跟2.6的不太一樣,2.6中,所有箭頭都是雙向的,且沒有不同各種類slab描述符的連結建立一個緩衝的專用隊列:1.從cache_cache中分配一個kmem_cache_t結構的快取描述符2.進行一系列計算,以確定最佳的slab構成3.設定各種參數4.將kmem_cache_t結構鏈入cache_cache的next隊列中利用這個專用隊列來為這個專
/*每次從未到期的作業中選擇分值最大的*/#include <iostream>#include <algorithm>using namespace std;struct node{int score;int deadline;bool flag;bool operator<(const node& B)const{if(score > B.score)return 1;if(score == B.score && deadline
上篇談到, 之前的程式使用堆尋找前K個最大值的效率並不理想,本篇嘗試對程式進行最佳化,以提高程式效率。 一、 演算法設計方面 要提高程式效率, 首先從演算法設計方面,即時間複雜度方面考慮。 由於尋找前K個最大值總要遍曆整個列表,因此,其效率必定不小於線性,而前面已經談到,使用堆尋找其效率平均情況下可以達到線性, 因此, 整體的演算法複雜度恰好為線性,無法在量級上有重大提升。 不過,通過仔細改進和最佳化,是可以將原來的效率提升若干倍的。
BTreeNode.htemplate<typename Type> class BTree;template<typename Type> class BTreeNode{public: friend BTree<Type>; BTreeNode(): m_nMaxSize(0), m_ptr(NULL), m_pparent(NULL){} BTreeNode(int size): m_nsize(0), m_nMaxSize(size)
一、題目用環形鏈表來實現字典操作INSERT、DELETE、SEARCH,並給出它們的已耗用時間二、代碼//List.h#include <string>using namespace std;//鏈表結點struct node{node *next;int key;node(int x):next(NULL),key(x){}};//鏈表struct list{node *Head;//頭結點,作為哨兵list():Head(){Head = new
在建立正確性的迴歸測試之後,繼續前進。 首先用效能工具分析下, 發現有點悲劇: 效率又倒退了。去除不必要的系統調用後, Profile分析結果如下: 七、 一些小改進 產生一億個隨機數也比較耗時, 可以看到rand()耗費時間並不多,但creatListInternal 耗費時間卻很多, 可以推斷, 模運算上耗費了很多時間。可以消除模運算。使用(1+rand()+rand()) * (1+rand())
任何複雜的事物總是由簡單的事物以各種方式組合和彙總而成。 正如任何事物均由原子和分子以各種方式組合和彙總而成。 這一古老而簡單的法則, 卻揭示出構造事物的真諦。 於是, 那些精通此法則的人們, 便似乎擁有了構造複雜事物的某種“超能力”, 設計出令人驚歎的各種發明, 小至手機, 大至宇宙飛船。 當事物越來越複雜的時候, 或許, 是時候迴歸一下本源了! 先來看一瓶醋的組成。 一瓶醋的組成非常簡單。 外面是一個瓶子,
//2054 類比題#include <iostream>using namespace std;int main(){ char p(char x[100000]); int j,i; char a[100000],b[100000]; while(cin>>a>>b) {//處理類似於3.000這樣的情況 for(i=0;i<strlen(a);i++) {