當前位置:首頁 > 公眾號精選 > 嵌入式大雜燴
[導讀]本文梳理了Linux文件系統(tǒng)的特點和主要功能。


作者:luozhiyun

來源:https://www.cnblogs.com/luozhiyun/p/13061199.html

Linux的文件系統(tǒng)特點

  • 文件系統(tǒng)要有嚴格的組織形式,使得文件能夠以塊為單位進行存儲。

  • 文件系統(tǒng)中也要有索引區(qū),用來方便查找一個文件分成的多個塊都存放在了什么位置。

  • 如果文件系統(tǒng)中有的文件是熱點文件,近期經(jīng)常被讀取和寫入,文件系統(tǒng)應該有緩存層。

  • 文件應該用文件夾的形式組織起來,方便管理和查詢。

  • Linux內核要在自己的內存里面維護一套數(shù)據(jù)結構,來保存哪些文件被哪些進程打開和使用。

總體來說,文件系統(tǒng)的主要功能梳理如下:

ext系列的文件系統(tǒng)的格式

inode與塊的存儲

硬盤分成相同大小的單元,我們稱為塊(Block)。一塊的大小是扇區(qū)大小的整數(shù)倍,默認是4K。在格式化的時候,這個值是可以設定的。

一大塊硬盤被分成了一個個小的塊,用來存放文件的數(shù)據(jù)部分。這樣一來,如果我們像存放一個文件,就不用給他分配一塊連續(xù)的空間了。我們可以分散成一個個小塊進行存放。這樣就靈活得多,也比較容易添加、刪除和插入數(shù)據(jù)。

inode就是文件索引的意思,我們每個文件都會對應一個inode;一個文件夾就是一個文件,也對應一個inode。

inode數(shù)據(jù)結構如下:

struct ext4_inode { __le16??i_mode; /*?File?mode?*/ __le16??i_uid; /*?Low?16?bits?of?Owner?Uid?*/ __le32??i_size_lo; /*?Size?in?bytes?*/ __le32??i_atime; /*?Access?time?*/ __le32??i_ctime; /*?Inode?Change?time?*/ __le32??i_mtime; /*?Modification?time?*/ __le32??i_dtime; /*?Deletion?Time?*/ __le16??i_gid; /*?Low?16?bits?of?Group?Id?*/ __le16??i_links_count; /*?Links?count?*/ __le32??i_blocks_lo; /*?Blocks?count?*/ __le32??i_flags; /*?File?flags?*/ ......
????__le32??i_block[EXT4_N_BLOCKS];/*?Pointers?to?blocks?*/ __le32??i_generation; /*?File?version?(for?NFS)?*/ __le32??i_file_acl_lo; /*?File?ACL?*/ __le32??i_size_high;
......
};

inode里面有文件的讀寫權限i_mode,屬于哪個用戶i_uid,哪個組i_gid,大小是多少i_size_io,占用多少個塊i_blocks_io,i_atime是access time,是最近一次訪問文件的時間;i_ctime是change time,是最近一次更改inode的時間;i_mtime是modify time,是最近一次更改文件的時間等。

所有的文件都是保存在i_block里面。具體保存規(guī)則由EXT4_N_BLOCKS決定,EXT4_N_BLOCKS有如下的定義:

#define EXT4_NDIR_BLOCKS????????12 #define EXT4_IND_BLOCK??????????EXT4_NDIR_BLOCKS #define EXT4_DIND_BLOCK?????????(EXT4_IND_BLOCK?+?1) #define EXT4_TIND_BLOCK?????????(EXT4_DIND_BLOCK?+?1) #define EXT4_N_BLOCKS???????????(EXT4_TIND_BLOCK?+?1) 

在ext2和ext3中,其中前12項直接保存了塊的位置,也就是說,我們可以通過i_block[0-11],直接得到保存文件內容的塊。

但是,如果一個文件比較大,12塊放不下。當我們用到i_block[12]的時候,就不能直接放數(shù)據(jù)塊的位置了,要不然i_block很快就會用完了。

那么可以讓i_block[12]指向一個塊,這個塊里面不放數(shù)據(jù)塊,而是放數(shù)據(jù)塊的位置,這個塊我們稱為間接塊。如果文件再大一些,i_block[13]會指向一個塊,我們可以用二次間接塊。二次間接塊里面存放了間接塊的位置,間接塊里面存放了數(shù)據(jù)塊的位置,數(shù)據(jù)塊里面存放的是真正的數(shù)據(jù)。如果文件再大點,那么i_block[14]同理。

這里面有一個非常顯著的問題,對于大文件來講,我們要多次讀取硬盤才能找到相應的塊,這樣訪問速度就會比較慢。

為了解決這個問題,ext4做了一定的改變。它引入了一個新的概念,叫作Extents。比方說,一個文件大小為128M,如果使用4k大小的塊進行存儲,需要32k個塊。如果按照ext2或者ext3那樣散著放,數(shù)量太大了。但是Extents可以用于存放連續(xù)的塊,也就是說,我們可以把128M放在一個Extents里面。這樣的話,對大文件的讀寫性能提高了,文件碎片也減少了。

Exents是一個樹狀結構:

每個節(jié)點都有一個頭,ext4_extent_header可以用來描述某個節(jié)點。

struct ext4_extent_header { __le16??eh_magic; /*?probably?will?support?different?formats?*/ __le16??eh_entries; /*?number?of?valid?entries?*/ __le16??eh_max; /*?capacity?of?store?in?entries?*/ __le16??eh_depth; /*?has?tree?real?underlying?blocks??*/ __le32??eh_generation; /*?generation?of?the?tree?*/ };

eh_entries表示這個節(jié)點里面有多少項。這里的項分兩種,如果是葉子節(jié)點,這一項會直接指向硬盤上的連續(xù)塊的地址,我們稱為數(shù)據(jù)節(jié)點ext4_extent;如果是分支節(jié)點,這一項會指向下一層的分支節(jié)點或者葉子節(jié)點,我們稱為索引節(jié)點ext4_extent_idx。這兩種類型的項的大小都是12個byte。

/*
?*?This?is?the?extent?on-disk?structure.
?*?It's?used?at?the?bottom?of?the?tree.
?*/ struct ext4_extent { __le32??ee_block; /*?first?logical?block?extent?covers?*/ __le16??ee_len; /*?number?of?blocks?covered?by?extent?*/ __le16??ee_start_hi; /*?high?16?bits?of?physical?block?*/ __le32??ee_start_lo; /*?low?32?bits?of?physical?block?*/ }; /*
?*?This?is?index?on-disk?structure.
?*?It's?used?at?all?the?levels?except?the?bottom.
?*/ struct ext4_extent_idx { __le32??ei_block; /*?index?covers?logical?blocks?from?'block'?*/ __le32??ei_leaf_lo; /*?pointer?to?the?physical?block?of?the?next?*
?????????????????*?level.?leaf?or?next?index?could?be?there?*/ __le16??ei_leaf_hi; /*?high?16?bits?of?physical?block?*/ __u16???ei_unused;
};

如果文件不大,inode里面的i_block中,可以放得下一個ext4_extent_header和4項ext4_extent。所以這個時候,eh_depth為0,也即inode里面的就是葉子節(jié)點,樹高度為0。

如果文件比較大,4個extent放不下,就要分裂成為一棵樹,eh_depth>0的節(jié)點就是索引節(jié)點,其中根節(jié)點深度最大,在inode中。最底層eh_depth=0的是葉子節(jié)點。

除了根節(jié)點,其他的節(jié)點都保存在一個塊4k里面,4k扣除ext4_extent_header的12個byte,剩下的能夠放340項,每個extent最大能表示128MB的數(shù)據(jù),340個extent會使你的表示的文件達到42.5GB。

inode位圖和塊位圖

inode的位圖大小為4k,每一位對應一個inode。如果是1,表示這個inode已經(jīng)被用了;如果是0,則表示沒被用。block的位圖同理。

在Linux操作系統(tǒng)里面,想要創(chuàng)建一個新文件,會調用open函數(shù),并且參數(shù)會有O_CREAT。這表示當文件找不到的時候,我們就需要創(chuàng)建一個。那么open函數(shù)的調用過程大致是:要打開一個文件,先要根據(jù)路徑找到文件夾。如果發(fā)現(xiàn)文件夾下面沒有這個文件,同時又設置了O_CREAT,就說明我們要在這個文件夾下面創(chuàng)建一個文件。

創(chuàng)建一個文件,那么就需要創(chuàng)建一個inode,那么就會從文件系統(tǒng)里面讀取inode位圖,然后找到下一個為0的inode,就是空閑的inode。對于block位圖,在寫入文件的時候,也會有這個過程。

文件系統(tǒng)的格式

數(shù)據(jù)塊的位圖是放在一個塊里面的,共4k。每位表示一個數(shù)據(jù)塊,共可以表示個數(shù)據(jù)塊。如果每個數(shù)據(jù)塊也是按默認的4K,最大可以表示空間為個byte,也就是128M,那么顯然是不夠的。

這個時候就需要用到塊組,數(shù)據(jù)結構為ext4_group_desc,這里面對于一個塊組里的inode位圖bg_inode_bitmap_lo、塊位圖bg_block_bitmap_lo、inode列表bg_inode_table_lo,都有相應的成員變量。

這樣一個個塊組,就基本構成了我們整個文件系統(tǒng)的結構。因為塊組有多個,塊組描述符也同樣組成一個列表,我們把這些稱為塊組描述符表。

我們還需要有一個數(shù)據(jù)結構,對整個文件系統(tǒng)的情況進行描述,這個就是超級塊ext4_super_block。里面有整個文件系統(tǒng)一共有多少inode,s_inodes_count;一共有多少塊,s_blocks_count_lo,每個塊組有多少inode,s_inodes_per_group,每個塊組有多少塊,s_blocks_per_group等。這些都是這類的全局信息。

最終,整個文件系統(tǒng)格式就是下面這個樣子。

默認情況下,超級塊和塊組描述符表都有副本保存在每一個塊組里面。防止這些數(shù)據(jù)丟失了,導致整個文件系統(tǒng)都打不開了。

由于如果每個塊組里面都保存一份完整的塊組描述符表,一方面很浪費空間;另一個方面,由于一個塊組最大128M,而塊組描述符表里面有多少項,這就限制了有多少個塊組,128M * 塊組的總數(shù)目是整個文件系統(tǒng)的大小,就被限制住了。

因此引入Meta Block Groups特性。

首先,塊組描述符表不會保存所有塊組的描述符了,而是將塊組分成多個組,我們稱為元塊組(Meta Block Group)。每個元塊組里面的塊組描述符表僅僅包括自己的,一個元塊組包含64個塊組,這樣一個元塊組中的塊組描述符表最多64項。

我們假設一共有256個塊組,原來是一個整的塊組描述符表,里面有256項,要備份就全備份,現(xiàn)在分成4個元塊組,每個元塊組里面的塊組描述符表就只有64項了,這就小多了,而且四個元塊組自己備份自己的。

根據(jù)圖中,每一個元塊組包含64個塊組,塊組描述符表也是64項,備份三份,在元塊組的第一個,第二個和最后一個塊組的開始處。

如果開啟了sparse_super特性,超級塊和塊組描述符表的副本只會保存在塊組索引為0、3、5、7的整數(shù)冪里。所以上圖的超級塊只在索引為0、3、5、7等的整數(shù)冪里。

目錄的存儲格式

其實目錄本身也是個文件,也有inode。inode里面也是指向一些塊。和普通文件不同的是,普通文件的塊里面保存的是文件數(shù)據(jù),而目錄文件的塊里面保存的是目錄里面一項一項的文件信息。這些信息我們稱為ext4_dir_entry。

在目錄文件的塊中,最簡單的保存格式是列表,每一項都會保存這個目錄的下一級的文件的文件名和對應的inode,通過這個inode,就能找到真正的文件。第一項是“.”,表示當前目錄,第二項是“…”,表示上一級目錄,接下來就是一項一項的文件名和inode。

如果在inode中設置EXT4_INDEX_FL標志,那么就表示根據(jù)索引查找文件。索引項會維護一個文件名的哈希值和數(shù)據(jù)塊的一個映射關系。

如果我們要查找一個目錄下面的文件名,可以通過名稱取哈希。如果哈希能夠匹配上,就說明這個文件的信息在相應的塊里面。然后打開這個塊,如果里面不再是索引,而是索引樹的葉子節(jié)點的話,那里面還是ext4_dir_entry的列表,我們只要一項一項找文件名就行。通過索引樹,我們可以將一個目錄下面的N多的文件分散到很多的塊里面,可以很快地進行查找。

Linux中的文件緩存

ext4文件系統(tǒng)層

對于ext4文件系統(tǒng)來講,內核定義了一個ext4_file_operations。

const struct file_operations ext4_file_operations =?{ ......
????.read_iter??=?ext4_file_read_iter,
????.write_iter?=?ext4_file_write_iter,
......
}

ext4_file_read_iter會調用generic_file_read_iter,ext4_file_write_iter會調用__generic_file_write_iter。

ssize_t generic_file_read_iter(struct kiocb?*iocb, struct iov_iter?*iter) {
...... if (iocb->ki_flags?&?IOCB_DIRECT)?{
...... struct address_space?*mapping?=?file->f_mapping;
......
????????retval?=?mapping->a_ops->direct_IO(iocb,?iter);
????}
......
????retval?=?generic_file_buffered_read(iocb,?iter,?retval);
}


ssize_t?__generic_file_write_iter(struct kiocb?*iocb, struct iov_iter?*from)
{
...... if (iocb->ki_flags?&?IOCB_DIRECT)?{
......
????????written?=?generic_file_direct_write(iocb, from);
......
????} else {
......
????????written?=?generic_perform_write(file, from,?iocb->ki_pos);
......
????}
}

generic_file_read_iter和__generic_file_write_iter有相似的邏輯,就是要區(qū)分是否用緩存。因此,根據(jù)是否使用內存做緩存,我們可以把文件的I/O操作分為兩種類型。

第一種類型是緩存I/O。大多數(shù)文件系統(tǒng)的默認I/O操作都是緩存I/O。對于讀操作來講,操作系統(tǒng)會先檢查,內核的緩沖區(qū)有沒有需要的數(shù)據(jù)。如果已經(jīng)緩存了,那就直接從緩存中返回;否則從磁盤中讀取,然后緩存在操作系統(tǒng)的緩存中。對于寫操作來講,操作系統(tǒng)會先將數(shù)據(jù)從用戶空間復制到內核空間的緩存中。這時對用戶程序來說,寫操作就已經(jīng)完成。至于什么時候再寫到磁盤中由操作系統(tǒng)決定,除非顯式地調用了sync同步命令。

第二種類型是直接IO,就是應用程序直接訪問磁盤數(shù)據(jù),而不經(jīng)過內核緩沖區(qū),從而減少了在內核緩存和用戶程序之間數(shù)據(jù)復制。

如果在寫的邏輯__generic_file_write_iter里面,發(fā)現(xiàn)設置了IOCB_DIRECT,則調用generic_file_direct_write,里面同樣會調用address_space的direct_IO的函數(shù),將數(shù)據(jù)直接寫入硬盤。

帶緩存的寫入操作

我們先來看帶緩存寫入的函數(shù)generic_perform_write。

ssize_t generic_perform_write(struct?file?*file,
????????????????struct?iov_iter?*i, loff_t pos)
{ struct address_space *mapping = file->f_mapping; const struct address_space_operations *a_ops = mapping->a_ops; do { struct page *page; unsigned long offset; /*?Offset?into?pagecache?page?*/ unsigned long bytes; /*?Bytes?to?write?to?page?*/ status?=?a_ops->write_begin(file,?mapping,?pos,?bytes,?flags,
????????????????????????&page,?&fsdata);
????????copied?=?iov_iter_copy_from_user_atomic(page,?i,?offset,?bytes);
????????flush_dcache_page(page);
????????status?=?a_ops->write_end(file,?mapping,?pos,?bytes,?copied,
????????????????????????page,?fsdata);
????????pos?+=?copied;
????????written?+=?copied;


????????balance_dirty_pages_ratelimited(mapping);
????} while (iov_iter_count(i));
}

循環(huán)中主要做了這幾件事:

  • 對于每一頁,先調用address_space的write_begin做一些準備;

  • 調用iov_iter_copy_from_user_atomic,將寫入的內容從用戶態(tài)拷貝到內核態(tài)的頁中;

  • 調用address_space的write_end完成寫操作;

  • 調用balance_dirty_pages_ratelimited,看臟頁是否太多,需要寫回硬盤。所謂臟頁,就是寫入到緩存,但是還沒有寫入到硬盤的頁面。

對于第一步,調用的是ext4_write_begin來說,主要做兩件事:

第一做日志相關的工作。

ext4是一種日志文件系統(tǒng),是為了防止突然斷電的時候的數(shù)據(jù)丟失,引入了日志(Journal)模式。日志文件系統(tǒng)比非日志文件系統(tǒng)多了一個Journal區(qū)域。文件在ext4中分兩部分存儲,一部分是文件的元數(shù)據(jù),另一部分是數(shù)據(jù)。元數(shù)據(jù)和數(shù)據(jù)的操作日志Journal也是分開管理的。你可以在掛載ext4的時候,選擇Journal模式。這種模式在將數(shù)據(jù)寫入文件系統(tǒng)前,必須等待元數(shù)據(jù)和數(shù)據(jù)的日志已經(jīng)落盤才能發(fā)揮作用。這樣性能比較差,但是最安全。

另一種模式是order模式。這個模式不記錄數(shù)據(jù)的日志,只記錄元數(shù)據(jù)的日志,但是在寫元數(shù)據(jù)的日志前,必須先確保數(shù)據(jù)已經(jīng)落盤。這個折中,是默認模式。

還有一種模式是writeback,不記錄數(shù)據(jù)的日志,僅記錄元數(shù)據(jù)的日志,并且不保證數(shù)據(jù)比元數(shù)據(jù)先落盤。這個性能最好,但是最不安全。

第二調用grab_cache_page_write_begin來,得到應該寫入的緩存頁。

struct?page?*grab_cache_page_write_begin(struct?address_space?*mapping, pgoff_t index, unsigned flags) { struct page *page; int fgp_flags?=?FGP_LOCK|FGP_WRITE|FGP_CREAT;
????page?=?pagecache_get_page(mapping,?index,?fgp_flags,
????????????mapping_gfp_mask(mapping)); if (page)
????????wait_for_stable_page(page); return page;
}

在內核中,緩存以頁為單位放在內存里面,每一個打開的文件都有一個struct file結構,每個struct file結構都有一個struct address_space用于關聯(lián)文件和內存,就是在這個結構里面,有一棵樹,用于保存所有與這個文件相關的的緩存頁。

對于第二步,調用iov_iter_copy_from_user_atomic。先將分配好的頁面調用kmap_atomic映射到內核里面的一個虛擬地址,然后將用戶態(tài)的數(shù)據(jù)拷貝到內核態(tài)的頁面的虛擬地址中,調用kunmap_atomic把內核里面的映射刪除。

size_t iov_iter_copy_from_user_atomic(struct?page?*page,
????????struct?iov_iter?*i, unsigned long offset, size_t bytes)
{ char *kaddr?=?kmap_atomic(page),?*p?=?kaddr?+?offset;
????iterate_all_kinds(i,?bytes,?v,
????????copyin((p?+=?v.iov_len)?-?v.iov_len,?v.iov_base,?v.iov_len),
????????memcpy_from_page((p?+=?v.bv_len)?-?v.bv_len,?v.bv_page,
?????????????????v.bv_offset,?v.bv_len), memcpy((p?+=?v.iov_len)?-?v.iov_len,?v.iov_base,?v.iov_len)
????)
????kunmap_atomic(kaddr); return bytes;
}

第三步中,調用ext4_write_end完成寫入。這里面會調用ext4_journal_stop完成日志的寫入,會調用block_write_end->__block_commit_write->mark_buffer_dirty,將修改過的緩存標記為臟頁??梢钥闯觯鋵嵥^的完成寫入,并沒有真正寫入硬盤,僅僅是寫入緩存后,標記為臟頁。

第四步,調用 balance_dirty_pages_ratelimited,是回寫臟頁。

/**
?*?balance_dirty_pages_ratelimited?-?balance?dirty?memory?state
?*?@mapping:?address_space?which?was?dirtied
?*
?*?Processes?which?are?dirtying?memory?should?call?in?here?once?for?each?page
?*?which?was?newly?dirtied.??The?function?will?periodically?check?the?system's
?*?dirty?state?and?will?initiate?writeback?if?needed.
??*/ void balance_dirty_pages_ratelimited(struct?address_space?*mapping) { struct inode *inode = mapping->host; struct backing_dev_info *bdi = inode_to_bdi(inode); struct bdi_writeback *wb = NULL; int ratelimit;
...... if (unlikely(current->nr_dirtied?>=?ratelimit))
????????balance_dirty_pages(mapping,?wb,?current->nr_dirtied);
......
}

在balance_dirty_pages_ratelimited里面,發(fā)現(xiàn)臟頁的數(shù)目超過了規(guī)定的數(shù)目,就調用balance_dirty_pages->wb_start_background_writeback,啟動一個背后線程開始回寫。

另外還有幾種場景也會觸發(fā)回寫:

  • 用戶主動調用sync,將緩存刷到硬盤上去,最終會調用wakeup_flusher_threads,同步臟頁;

  • 當內存十分緊張,以至于無法分配頁面的時候,會調用free_more_memory,最終會調用wakeup_flusher_threads,釋放臟頁;

  • 臟頁已經(jīng)更新了較長時間,時間上超過了設定時間,需要及時回寫,保持內存和磁盤上數(shù)據(jù)一致性。

帶緩存的讀操作

看帶緩存的讀,對應的是函數(shù)generic_file_buffered_read。

static ssize_t generic_file_buffered_read(struct?kiocb?*iocb,
????????struct?iov_iter?*iter, ssize_t written) { struct file *filp = iocb->ki_filp; struct address_space *mapping = filp->f_mapping; struct inode *inode = mapping->host; for (;;)?{ struct page *page; pgoff_t end_index; loff_t isize;
????????page?=?find_get_page(mapping,?index); if (!page)?{ if (iocb->ki_flags?&?IOCB_NOWAIT) goto would_block;
????????????page_cache_sync_readahead(mapping,
????????????????????ra,?filp,
????????????????????index,?last_index?-?index);
????????????page?=?find_get_page(mapping,?index); if (unlikely(page?== NULL)) goto no_cached_page;
????????} if (PageReadahead(page))?{
????????????page_cache_async_readahead(mapping,
????????????????????ra,?filp,?page,
????????????????????index,?last_index?-?index);
????????} /*
?????????*?Ok,?we?have?the?page,?and?it's?up-to-date,?so
?????????*?now?we?can?copy?it?to?user?space...
?????????*/ ret?=?copy_page_to_iter(page,?offset,?nr,?iter);
????}
}

在generic_file_buffered_read函數(shù)中,我們需要先找到page cache里面是否有緩存頁。如果沒有找到,不但讀取這一頁,還要進行預讀,這需要在page_cache_sync_readahead函數(shù)中實現(xiàn)。預讀完了以后,再試一把查找緩存頁。

如果第一次找緩存頁就找到了,我們還是要判斷,是不是應該繼續(xù)預讀;如果需要,就調用page_cache_async_readahead發(fā)起一個異步預讀。

最后,copy_page_to_iter會將內容從內核緩存頁拷貝到用戶內存空間。

免責聲明:本文來源網(wǎng)絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯(lián)系我進行刪除。

猜你喜歡

嵌入式Linux項目開發(fā)的幾個步驟

從串口驅動到Linux驅動模型


1024G 嵌入式資源大放送!包括但不限于C/C++、單片機、Linux等。在公眾號聊天界面回復1024,即可免費獲取!

免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉