国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深入講解Linux內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)和算法

這篇具有很好參考價(jià)值的文章主要介紹了深入講解Linux內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)和算法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

深入講解Linux內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)和算法

Linux內(nèi)核代碼中廣泛使用了數(shù)據(jù)結(jié)構(gòu)和算法,其中最常用的兩個(gè)是鏈表和紅黑樹(shù)。

鏈表

Linux內(nèi)核代碼大量使用了鏈表這種數(shù)據(jù)結(jié)構(gòu)。鏈表是在解決數(shù)組不能動(dòng)態(tài)擴(kuò)展這個(gè)缺陷而產(chǎn)生的一種數(shù)據(jù)結(jié)構(gòu)。鏈表所包含的元素可以動(dòng)態(tài)創(chuàng)建并插入和刪除。鏈表的每個(gè)元素都是離散存放的,因此不需要占用連續(xù)的內(nèi)存。鏈表通常由若干節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)的結(jié)構(gòu)都是一樣的,由有效數(shù)據(jù)區(qū)和指針區(qū)兩部分組成。有效數(shù)據(jù)區(qū)用來(lái)存儲(chǔ)有效數(shù)據(jù)信息,而指針區(qū)用來(lái)指向鏈表的前繼節(jié)點(diǎn)或者后繼節(jié)點(diǎn)。因此,鏈表就是利用指針將各個(gè)節(jié)點(diǎn)串聯(lián)起來(lái)的一種存儲(chǔ)結(jié)構(gòu)。

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-414836.html

(1)單向鏈表

單向鏈表的指針區(qū)只包含一個(gè)指向下一個(gè)節(jié)點(diǎn)的指針,因此會(huì)形成一個(gè)單一方向的鏈表,如下代碼所示。

struct list {
    int data;   /*有效數(shù)據(jù)*/
    struct list *next; /*指向下一個(gè)元素的指針*/
};

如圖所示,單向鏈表具有單向移動(dòng)性,也就是只能訪問(wèn)當(dāng)前的節(jié)點(diǎn)的后繼節(jié)點(diǎn),而無(wú)法訪問(wèn)當(dāng)前節(jié)點(diǎn)的前繼節(jié)點(diǎn),因此在實(shí)際項(xiàng)目中運(yùn)用得比較少。

深入講解Linux內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)和算法

單向鏈表示意圖

(2)雙向鏈表

如圖所示,雙向鏈表和單向鏈表的區(qū)別是指針區(qū)包含了兩個(gè)指針,一個(gè)指向前繼節(jié)點(diǎn),另一個(gè)指向后繼節(jié)點(diǎn),如下代碼所示。

struct list {
    int data;   /*有效數(shù)據(jù)*/
    struct list *next; /*指向下一個(gè)元素的指針*/
    struct list *prev; /*指向上一個(gè)元素的指針*/
};

深入講解Linux內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)和算法

雙向鏈表示意圖

(3)Linux內(nèi)核鏈表實(shí)現(xiàn)

單向鏈表和雙向鏈表在實(shí)際使用中有一些局限性,如數(shù)據(jù)區(qū)必須是固定數(shù)據(jù),而實(shí)際需求是多種多樣的。這種方法無(wú)法構(gòu)建一套通用的鏈表,因?yàn)槊總€(gè)不同的數(shù)據(jù)區(qū)需要一套鏈表。為此,Linux內(nèi)核把所有鏈表操作方法的共同部分提取出來(lái),把不同的部分留給代碼編程者自己去處理。Linux內(nèi)核實(shí)現(xiàn)了一套純鏈表的封裝,鏈表節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)只有指針區(qū)而沒(méi)有數(shù)據(jù)區(qū),另外還封裝了各種操作函數(shù),如創(chuàng)建節(jié)點(diǎn)函數(shù)、插入節(jié)點(diǎn)函數(shù)、刪除節(jié)點(diǎn)函數(shù)、遍歷節(jié)點(diǎn)函數(shù)等。

Linux內(nèi)核鏈表使用struct list_head數(shù)據(jù)結(jié)構(gòu)來(lái)描述。

<include/linux/types.h>

struct list_head {
    struct list_head *next, *prev;
};

struct list_head數(shù)據(jù)結(jié)構(gòu)不包含鏈表節(jié)點(diǎn)的數(shù)據(jù)區(qū),通常是嵌入其他數(shù)據(jù)結(jié)構(gòu),如struct page數(shù)據(jù)結(jié)構(gòu)中嵌入了一個(gè)lru鏈表節(jié)點(diǎn),通常是把page數(shù)據(jù)結(jié)構(gòu)掛入LRU鏈表。

<include/linux/mm_types.h>

struct page {
    ...
    struct list_head lru;
    ...
}

鏈表頭的初始化有兩種方法,一種是靜態(tài)初始化,另一種動(dòng)態(tài)初始化。

把next和prev指針都初始化并指向自己,這樣便初始化了一個(gè)帶頭節(jié)點(diǎn)的空鏈表。

<include/linux/list.h>

/*靜態(tài)初始化*/
#define LIST_HEAD_INIT(name) { &(name), &(name) }

#define LIST_HEAD(name) \
    struct list_head name = LIST_HEAD_INIT(name)

/*動(dòng)態(tài)初始化*/
static inline void INIT_LIST_HEAD(struct list_head *list)
{
    list->next = list;
    list->prev = list;
}

添加節(jié)點(diǎn)到一個(gè)鏈表中,內(nèi)核提供了幾個(gè)接口函數(shù),如list_add()是把一個(gè)節(jié)點(diǎn)添加到表頭,list_add_tail()是插入表尾。

<include/linux/list.h>

void list_add(struct list_head *new, struct list_head *head)
list_add_tail(struct list_head *new, struct list_head *head)

遍歷節(jié)點(diǎn)的接口函數(shù)。

#define list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next)

這個(gè)宏只是遍歷一個(gè)一個(gè)節(jié)點(diǎn)的當(dāng)前位置,那么如何獲取節(jié)點(diǎn)本身的數(shù)據(jù)結(jié)構(gòu)呢?這里還需要使用list_entry()宏。

#define list_entry(ptr, type, member) \
    container_of(ptr, type, member)
container_of()宏的定義在kernel.h頭文件中。
#define container_of(ptr, type, member) ({            \
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
    (type *)( (char *)__mptr - offsetof(type,member) );})

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

其中offsetof()宏是通過(guò)把0地址轉(zhuǎn)換為type類(lèi)型的指針,然后去獲取該結(jié)構(gòu)體中member成員的指針,也就是獲取了membertype結(jié)構(gòu)體中的偏移量。最后用指針ptr減去offset,就得到type結(jié)構(gòu)體的真實(shí)地址了。

下面是遍歷鏈表的一個(gè)例子。

<drivers/block/osdblk.c>

static ssize_t class_osdblk_list(struct class *c,
                struct class_attribute *attr,
                char *data)
{
    int n = 0;
    struct list_head *tmp;

    list_for_each(tmp, &osdblkdev_list) {
        struct osdblk_device *osdev;

        osdev = list_entry(tmp, struct osdblk_device, node);

        n += sprintf(data+n, "%d %d %llu %llu %s\n",
            osdev->id,
            osdev->major,
            osdev->obj.partition,
            osdev->obj.id,
            osdev->osd_path);
    }
    return n;
}

??資料直通車(chē):Linux內(nèi)核源碼技術(shù)學(xué)習(xí)路線+視頻教程內(nèi)核源碼

學(xué)習(xí)直通車(chē):Linux內(nèi)核源碼內(nèi)存調(diào)優(yōu)文件系統(tǒng)進(jìn)程管理設(shè)備驅(qū)動(dòng)/網(wǎng)絡(luò)協(xié)議棧

紅黑樹(shù)

紅黑樹(shù)(Red Black Tree)被廣泛應(yīng)用在內(nèi)核的內(nèi)存管理和進(jìn)程調(diào)度中,用于將排序的元素組織到樹(shù)中。紅黑樹(shù)被廣泛應(yīng)用在計(jì)算機(jī)科學(xué)的各個(gè)領(lǐng)域中,它在速度和實(shí)現(xiàn)復(fù)雜度之間提供一個(gè)很好的平衡。

紅黑樹(shù)是具有以下特征的二叉樹(shù)。

每個(gè)節(jié)點(diǎn)或紅或黑。

  • 每個(gè)葉節(jié)點(diǎn)是黑色的。
  • 如果結(jié)點(diǎn)都是紅色,那么兩個(gè)子結(jié)點(diǎn)都是黑色。
  • 從一個(gè)內(nèi)部結(jié)點(diǎn)到葉結(jié)點(diǎn)的簡(jiǎn)單路徑上,對(duì)所有葉節(jié)點(diǎn)來(lái)說(shuō),黑色結(jié)點(diǎn)的數(shù)目都是相同的。

紅黑樹(shù)的一個(gè)優(yōu)點(diǎn)是,所有重要的操作(例如插入、刪除、搜索)都可以在O(log?n)時(shí)間內(nèi)完成,n為樹(shù)中元素的數(shù)目。經(jīng)典的算法教科書(shū)都會(huì)講解紅黑樹(shù)的實(shí)現(xiàn),這里只是列出一個(gè)內(nèi)核中使用紅黑樹(shù)的例子,供讀者在實(shí)際的驅(qū)動(dòng)和內(nèi)核編程中參考。這個(gè)例子可以在內(nèi)核代碼的documentation/Rbtree.txt文件中找到。

#include <linux/init.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/mm.h>
#include <linux/rbtree.h>

MODULE_AUTHOR("figo.zhang");
MODULE_DESCRIPTION(" ");
MODULE_LICENSE("GPL");

  struct mytype { 
     struct rb_node node;
     int key; 
};

/*紅黑樹(shù)根節(jié)點(diǎn)*/
 struct rb_root mytree = RB_ROOT;
/*根據(jù)key來(lái)查找節(jié)點(diǎn)*/
struct mytype *my_search(struct rb_root *root, int new)
  {
     struct rb_node *node = root->rb_node;

     while (node) {
          struct mytype *data = container_of(node, struct mytype, node);

          if (data->key > new)
               node = node->rb_left;
          else if (data->key < new)
               node = node->rb_right;
          else
               return data;
     }
     return NULL;
  }

/*插入一個(gè)元素到紅黑樹(shù)中*/
  int my_insert(struct rb_root *root, struct mytype *data)
  {
     struct rb_node **new = &(root->rb_node), *parent=NULL;

     /* 尋找可以添加新節(jié)點(diǎn)的地方 */
     while (*new) {
          struct mytype *this = container_of(*new, struct mytype, node);

          parent = *new;
          if (this->key > data->key)
               new = &((*new)->rb_left);
          else if (this->key < data->key) {
               new = &((*new)->rb_right);
          } else
               return -1;
     }

     /* 添加一個(gè)新節(jié)點(diǎn) */
     rb_link_node(&data->node, parent, new);
     rb_insert_color(&data->node, root);

     return 0;
  }

static int __init my_init(void)
{
     int i;
     struct mytype *data;
     struct rb_node *node;

     /*插入元素*/
     for (i =0; i < 20; i+=2) {
          data = kmalloc(sizeof(struct mytype), GFP_KERNEL);
          data->key = i;
          my_insert(&mytree, data);
     }

     /*遍歷紅黑樹(shù),打印所有節(jié)點(diǎn)的key值*/
      for (node = rb_first(&mytree); node; node = rb_next(node)) 
          printk("key=%d\n", rb_entry(node, struct mytype, node)->key);

     return 0;
}

static void __exit my_exit(void)
{
     struct mytype *data;
     struct rb_node *node;
     for (node = rb_first(&mytree); node; node = rb_next(node)) {
          data = rb_entry(node, struct mytype, node);
          if (data) {
                rb_erase(&data->node, &mytree);
                kfree(data);
          }
     }
}
module_init(my_init);
module_exit(my_exit);

mytree是紅黑樹(shù)的根節(jié)點(diǎn),my_insert()實(shí)現(xiàn)插入一個(gè)元素到紅黑樹(shù)中,my_search()根據(jù)key來(lái)查找節(jié)點(diǎn)。內(nèi)核大量使用紅黑樹(shù),如虛擬地址空間VMA的管理。

無(wú)鎖環(huán)形緩沖區(qū)

生產(chǎn)者和消費(fèi)者模型是計(jì)算機(jī)編程中最常見(jiàn)的一種模型。生產(chǎn)者產(chǎn)生數(shù)據(jù),而消費(fèi)者消耗數(shù)據(jù),如一個(gè)網(wǎng)絡(luò)設(shè)備,硬件設(shè)備接收網(wǎng)絡(luò)包,然后應(yīng)用程序讀取網(wǎng)絡(luò)包。環(huán)形緩沖區(qū)是實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者模型的經(jīng)典算法。環(huán)形緩沖區(qū)通常有一個(gè)讀指針和一個(gè)寫(xiě)指針。讀指針指向環(huán)形緩沖區(qū)中可讀的數(shù)據(jù),寫(xiě)指針指向環(huán)形緩沖區(qū)可寫(xiě)的數(shù)據(jù)。通過(guò)移動(dòng)讀指針和寫(xiě)指針實(shí)現(xiàn)緩沖區(qū)數(shù)據(jù)的讀取和寫(xiě)入。

在Linux內(nèi)核中,KFIFO是采用無(wú)鎖環(huán)形緩沖區(qū)的實(shí)現(xiàn)。FIFO的全稱(chēng)是“First In First Out”,即先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),它采用環(huán)形緩沖區(qū)的方法來(lái)實(shí)現(xiàn),并提供一個(gè)無(wú)邊界的字節(jié)流服務(wù)。采用環(huán)形緩沖區(qū)的好處是,當(dāng)一個(gè)數(shù)據(jù)元素被消耗之后,其余數(shù)據(jù)元素不需要移動(dòng)其存儲(chǔ)位置,從而減少?gòu)?fù)制,提高效率。

(1)創(chuàng)建KFIFO

在使用KFIFO之前需要進(jìn)行初始化,這里有靜態(tài)初始化和動(dòng)態(tài)初始化兩種方式。

<include/linux/kfifo.h>

int kfifo_alloc(fifo, size, gfp_mask)

該函數(shù)創(chuàng)建并分配一個(gè)大小為size的KFIFO環(huán)形緩沖區(qū)。第一個(gè)參數(shù)fifo是指向該環(huán)形緩沖區(qū)的struct kfifo數(shù)據(jù)結(jié)構(gòu);第二個(gè)參數(shù)size是指定緩沖區(qū)元素的數(shù)量;第三個(gè)參數(shù)gfp_mask表示分配KFIFO元素使用的分配掩碼。

靜態(tài)分配可以使用如下的宏。

#define DEFINE_KFIFO(fifo, type, size)
#define INIT_KFIFO(fifo)

(2)入列

把數(shù)據(jù)寫(xiě)入KFIFO環(huán)形緩沖區(qū)可以使用kfifo_in()函數(shù)接口。

int kfifo_in(fifo, buf, n)

該函數(shù)把buf指針指向的n個(gè)數(shù)據(jù)復(fù)制到KFIFO環(huán)形緩沖區(qū)中。第一個(gè)參數(shù)fifo指的是KFIFO環(huán)形緩沖區(qū);第二個(gè)參數(shù)buf指向要復(fù)制的數(shù)據(jù)的buffer;第三個(gè)數(shù)據(jù)是要復(fù)制數(shù)據(jù)元素的數(shù)量。

(3)出列

從KFIFO環(huán)形緩沖區(qū)中列出或者摘取數(shù)據(jù)可以使用kfifo_out()函數(shù)接口。

#define    kfifo_out(fifo, buf, n)

該函數(shù)是從fifo指向的環(huán)形緩沖區(qū)中復(fù)制n個(gè)數(shù)據(jù)元素到buf指向的緩沖區(qū)中。如果KFIFO環(huán)形緩沖區(qū)的數(shù)據(jù)元素小于n個(gè),那么復(fù)制出去的數(shù)據(jù)元素小于n個(gè)。

(4)獲取緩沖區(qū)大小

KFIFO提供了幾個(gè)接口函數(shù)來(lái)查詢環(huán)形緩沖區(qū)的狀態(tài)。

#define kfifo_size(fifo)
#define kfifo_len(fifo)
#define kfifo_is_empty(fifo)
#define kfifo_is_full(fifo)

kfifo_size()用來(lái)獲取環(huán)形緩沖區(qū)的大小,也就是最大可以容納多少個(gè)數(shù)據(jù)元素。kfifo_len()用來(lái)獲取當(dāng)前環(huán)形緩沖區(qū)中有多少個(gè)有效數(shù)據(jù)元素。kfifo_is_empty()判斷環(huán)形緩沖區(qū)是否為空。kfifo_is_full()判斷環(huán)形緩沖區(qū)是否為滿。

(5)與用戶空間數(shù)據(jù)交互

KFIFO還封裝了兩個(gè)函數(shù)與用戶空間數(shù)據(jù)交互。

#define    kfifo_from_user(fifo, from, len, copied)
#define    kfifo_to_user(fifo, to, len, copied)

kfifo_from_user()是把from指向的用戶空間的len個(gè)數(shù)據(jù)元素復(fù)制到KFIFO中,最后一個(gè)參數(shù)copied表示成功復(fù)制了幾個(gè)數(shù)據(jù)元素。

kfifo_to_user()則相反,把KFIFO的數(shù)據(jù)元素復(fù)制到用戶空間。這兩個(gè)宏結(jié)合了copy_to_user()、copy_from_user()以及KFIFO的機(jī)制,給驅(qū)動(dòng)開(kāi)發(fā)者提供了方便。

深入講解Linux內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)和算法

?

到了這里,關(guān)于深入講解Linux內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)和算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 真正理解紅黑樹(shù),真正的(Linux內(nèi)核里大量用到的數(shù)據(jù)結(jié)構(gòu)

    真正理解紅黑樹(shù),真正的(Linux內(nèi)核里大量用到的數(shù)據(jù)結(jié)構(gòu)

    作為一種數(shù)據(jù)結(jié)構(gòu),紅黑樹(shù)可謂不算樸素,因?yàn)楦鞣N宣傳讓它過(guò)于神秘,網(wǎng)上搜羅了一大堆的關(guān)于紅黑樹(shù)的文章,不外乎千篇一律,介紹概念,分析性能,貼上代碼,然后給上罪惡的一句話,它最壞情況怎么怎么地... 我們想,一棵二叉樹(shù)怎么就是最壞情況,那就是它退化為一

    2024年02月16日
    瀏覽(19)
  • RK3588平臺(tái)開(kāi)發(fā)系列講解(進(jìn)程篇)Linux 進(jìn)程的數(shù)據(jù)結(jié)構(gòu)

    RK3588平臺(tái)開(kāi)發(fā)系列講解(進(jìn)程篇)Linux 進(jìn)程的數(shù)據(jù)結(jié)構(gòu)

    平臺(tái) 內(nèi)核版本 安卓版本 RK3588 Linux 5.10 Android 12 沉淀、分享、成長(zhǎng),讓自己和他人都能有所收獲!?? ?? 本篇將介紹 Linux 如何表示進(jìn)程。 Linux 系統(tǒng)下,把運(yùn)行中的應(yīng)用程序抽象成一個(gè)數(shù)據(jù)結(jié)構(gòu) task_struct ,一個(gè)應(yīng)用程序所需要的各種資源,如內(nèi)存、文件等都包含在 task_struct

    2024年02月07日
    瀏覽(21)
  • RK3588平臺(tái)開(kāi)發(fā)系列講解(內(nèi)存篇)Linux 伙伴系統(tǒng)數(shù)據(jù)結(jié)構(gòu)

    RK3588平臺(tái)開(kāi)發(fā)系列講解(內(nèi)存篇)Linux 伙伴系統(tǒng)數(shù)據(jù)結(jié)構(gòu)

    平臺(tái) 內(nèi)核版本 安卓版本 RK3588 Linux 5.10 Android 12 沉淀、分享、成長(zhǎng),讓自己和他人都能有所收獲!?? ??Linux 系統(tǒng)中,用來(lái)管理物理內(nèi)存頁(yè)面的伙伴系統(tǒng),以及負(fù)責(zé)分配比頁(yè)更小的內(nèi)存對(duì)象的 SLAB 分配器了。 本篇將介紹伙伴系統(tǒng)相關(guān)數(shù)據(jù)結(jié)構(gòu)體。 Linux 也是使用分頁(yè)機(jī)制管理物

    2024年02月05日
    瀏覽(29)
  • 【腳踢數(shù)據(jù)結(jié)構(gòu)】?jī)?nèi)核鏈表

    【腳踢數(shù)據(jù)結(jié)構(gòu)】?jī)?nèi)核鏈表

    (??? ),Hello我是 祐言QAQ 我的博客主頁(yè):C/C++語(yǔ)言,Linux基礎(chǔ),ARM開(kāi)發(fā)板,軟件配置等領(lǐng)域博主?? 快上??,一起學(xué)習(xí),讓我們成為一個(gè)強(qiáng)大的攻城獅! 送給自己和讀者的一句雞湯??: 集中起來(lái)的意志可以擊穿頑石! 作者水平很有限,如果發(fā)現(xiàn)錯(cuò)誤,可在評(píng)論區(qū)指正,感謝??

    2024年02月13日
    瀏覽(20)
  • 《LKD3粗讀筆記》(6)內(nèi)核數(shù)據(jù)結(jié)構(gòu)

    《LKD3粗讀筆記》(6)內(nèi)核數(shù)據(jù)結(jié)構(gòu)

    單向鏈表和雙向鏈表 這里涉及到了對(duì) void 的理解:C高級(jí)編程——關(guān)于void類(lèi)型的解釋 鏈表的特點(diǎn) 鏈表是一種存放和操作可變數(shù)量元素(常稱(chēng)為結(jié)點(diǎn))的數(shù)據(jù)結(jié)構(gòu) 與靜態(tài)數(shù)組不同的是,鏈表所包含的元素都是動(dòng)態(tài)創(chuàng)建并插入鏈表的,在編譯時(shí)不必知道具體創(chuàng)建多少個(gè)元

    2023年04月12日
    瀏覽(26)
  • 紅黑樹(shù)下崗,內(nèi)核新數(shù)據(jù)結(jié)構(gòu)上場(chǎng):maple tree!

    紅黑樹(shù)下崗,內(nèi)核新數(shù)據(jù)結(jié)構(gòu)上場(chǎng):maple tree!

    ? 在外界看來(lái),Linux 內(nèi)核的內(nèi)部似乎變化很少,尤其是像內(nèi)存管理子系統(tǒng)(memory-management subsystem)這樣的子系統(tǒng)。然而,開(kāi)發(fā)人員時(shí)常需要更換內(nèi)部接口來(lái)解決某些長(zhǎng)期存在的問(wèn)題。比如,其中一個(gè)問(wèn)題就是用來(lái)保護(hù)內(nèi)存管理里的重要結(jié)構(gòu)的鎖的競(jìng)爭(zhēng)問(wèn)題,這些重要結(jié)構(gòu)是指

    2024年02月04日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】從數(shù)據(jù)結(jié)構(gòu)角度深入探究隊(duì)列

    【數(shù)據(jù)結(jié)構(gòu)】從數(shù)據(jù)結(jié)構(gòu)角度深入探究隊(duì)列

    隊(duì)列是計(jì)算機(jī)科學(xué)中的一種基本數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)和管理數(shù)據(jù)。在計(jì)算機(jī)程序中,隊(duì)列被廣泛應(yīng)用于任務(wù)調(diào)度、進(jìn)程管理等場(chǎng)景。本文將介紹隊(duì)列的概念、特點(diǎn)、常見(jiàn)操作以及應(yīng)用。 你們?cè)谟秒娔X時(shí)有沒(méi)有經(jīng)歷過(guò),機(jī)器有時(shí)會(huì)處于疑似死機(jī)的狀態(tài),鼠標(biāo)點(diǎn)什么似乎都沒(méi)用,

    2024年02月06日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu):哈希表講解

    數(shù)據(jù)結(jié)構(gòu):哈希表講解

    哈希: 一種 映射思想 ,也叫散列。即和另一個(gè)值建立一個(gè)關(guān)聯(lián)關(guān)系。注意 這里指的關(guān)聯(lián)關(guān)系是多樣的 ,比如給你,你可以通過(guò)映射關(guān)系確定該值在不在或者獲得其它信息,不一定要存儲(chǔ)另一個(gè)值。 哈希表 :也叫散列表,體現(xiàn)了哈希思想。即和存儲(chǔ)位置

    2024年02月05日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu):跳表講解

    數(shù)據(jù)結(jié)構(gòu):跳表講解

    1.1簡(jiǎn)介 skiplist本質(zhì)上也是一種 查找結(jié)構(gòu) ,用于解決算法中的查找問(wèn)題,跟 平衡搜索樹(shù)和哈希表 的價(jià)值是一樣的,可以 作為key或者key/value的查找模型 。后面我會(huì)進(jìn)行比對(duì)。 skiplist是由 William Pugh發(fā)明 的,最早出現(xiàn)于他在1990年發(fā)表的論文《Skip Lists: A Probabilistic Alternative to Ba

    2024年02月22日
    瀏覽(16)
  • 【數(shù)據(jù)結(jié)構(gòu)】順序表 | 詳細(xì)講解

    【數(shù)據(jù)結(jié)構(gòu)】順序表 | 詳細(xì)講解

    在計(jì)算機(jī)中主要有兩種基本的存儲(chǔ)結(jié)構(gòu)用于存放線性表:順序存儲(chǔ)結(jié)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。本篇文章介紹采用順序存儲(chǔ)的結(jié)構(gòu)實(shí)現(xiàn)線性表的存儲(chǔ)。 線性表的順序存儲(chǔ)結(jié)構(gòu),指的是一段地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)鏈性表的數(shù)據(jù)元素。 線性表的(,……)的順序存儲(chǔ)示意圖如下

    2024年02月04日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包