c語言cpu內存
❶ c語言竟是如何調用硬體
大家都知道我們可以使用C語言寫一段程序來控制硬體工作,但你知道其工作原理嗎?以下僅供參考!
c語言在實際運行中,都是以匯編指令的方式運行的,由編譯器把C語言編譯成匯編指令,CPU直接執行匯編指令。
所以這個問題就變成,匯編指令是如何操作硬體的?
如果把硬體平台限制在x86環境下,那麼匯編指令操作硬體基本上只有兩種方式:
方式一:
通過向內存空間寫數據。硬體會把硬體上的各種寄存器(外行可以理解為訪問硬體的介面或者操作硬體的工具)映射到某一塊內存地址空間上,之後只要用匯編指令,甚至C語言去讀寫這一段內存地址空間(並非真正操作物理內存),就可以達到操作硬體的目的了。
如果題主還有WindowsXP環境(虛擬機也可以),就可以用匯編指令直接操作顯存:
MOV AX,B800
MOV ES,AX
XOR DI,DI
MOV CX,0800
MOV AX,5555
REPZ STOSB
硬體的各種寄存器會被映射到某一塊物理內存中,這種方式稱為MMIO,在Windows的設備管理器里,右鍵點設備,看屬性-》資源里,不少硬體設備都有「內存范圍」的參數,這里的內存范圍就表示這個硬體的資源可以通過訪問這一段內存來控制它。
方式二:
x86匯編中,還有兩個特殊的指令是IN和OUT,這是x86平台上獨有的,上面圖里的I/O范圍,就是用IN/OUT這兩個指令來訪問和控制的。
以上兩種訪問硬體的方式,第一種是可以用C語言實現的,上面一段匯編,本質上類似於C語言代碼:
char ptr = 0xB8000;
int i;
for (i = 0; i 《0x800; i++)
{ptr + i = 0x55;
}
第二種IN/OUT方式沒有直接的C語言語法對應,需要自己封裝匯編。
那麼為什麼平時很難用C語言操作硬體呢?這是因為平時寫的代碼大多數都在保護模式下,保護模式下,直接訪問物理地址會受到限制,C語言操作的地址都是虛地址。
對於Windows來說,要訪問物理地址,需要工作在內核模式,也就是的寫驅動才行。
而在顯存方面,首先,題主要先明白物理地址和虛擬地址的概念。
原來的8086cpu設計的時候,地址空間有一塊區域(640K-1M)之間,有一塊作為顯存使用
這里你說的預留的地址,是指物理地址,這一段地址的准確范圍是000A0000-000BFFFF,不管是32位還是64位CPU,這一段物理內存地址一直都保留給顯存使用,不區分32位還是64位,也不區分保護模式還是實模式。
可見這一段內存至今仍然是留給顯卡使用的。
那麼現在為什麼不能直接用這段內存了?
因為現在的軟體都運行在保護模式下,訪問的地址都是虛擬地址,而並非物理地址,包括你使用cmd命令打開的環境,都是虛擬地址,雖然32位XP里能用debug命令向000B8000上寫數據並能顯示在cmd的界面里,但本質上,這都是虛擬出來的。
如果要想用這段顯存怎麼辦?
自己寫一個簡易的操作系統,不啟動顯卡的各種圖形加速功能,CPU進入保護模式後在GDT里映射一個4G的數據段,與物理地址一致,那麼向000B8000上寫數據,就會像過去DOS一樣顯示在屏幕上,所以保護模式下也可以訪問這一段內存。所以,保護模式下,也可以用它。
顯卡那麼多顯存是怎麼映射的?
有很多內存地址被映射給顯存了,就是通過這種映射關系,把一些物理地址留給顯存,使得CPU能像訪問內存一樣訪問顯存資源。
當然,實際情況是,2G顯存未必完全映射,而是只映射一部分地址,顯卡有一些開放的寄存器能夠控制哪部分顯存映射過來,這樣就能使得CPU在使用比較少的物理地址范圍的情況下,訪問全部的顯存。
還有一個很有意思的事情:在虛擬機里,找到映射的高地址部分的第一塊內存區域,寫一個能直接訪問物理地址的程序(比如一個驅動),去讀這一塊內存,然後寫到文件里,再用屏幕截圖,也寫到文件里,會發現截圖的內容和顯存里讀出來的內容基本上是一樣的。
網友awayisblue
要回答你的問題,我們需要要知道:
硬體是一種什麼樣的存在
什麼是驅動。
C語言怎麼操作硬體
我就不嚴格去定義這些概念了,我就以一個例子來通俗地講解一下吧。
首先講硬體:
先介紹一款單片機晶元STM8。
這款晶元裡面有cpu, 內存,寄存器(先不要覺得看到新名詞壓力大,繼續往下看)等等,相當於我們的電腦了,但還要外接其它硬體。
這里你需要知道的概念是:
晶元的引腳跟寄存器是相對應的,寄存器是8位的內存單元(對,存在於內存上面),當你往這個內存單元裡面寫入數據時,晶元的引腳的電壓會發生變化,比如說我寫入的是01100001,則晶元上與之對應的8個引腳的電壓狀態(分為高電平與低電平兩種)會輸出:低高高低低低低高。
cpu可以執行代碼指令,指令可以操作內存。
結論:所以從上面兩點可以我們可以知道,cpu可以執行指令,使晶元的引腳電平(電壓)發生變化。
關於這款顯示器,我們需要知道的是:
它是有引腳的,這些引腳可以跟到前面介紹的那款單片機晶元的引腳相連。
該顯示器有自帶的內存,用於存儲要顯示的字元,顯示器從該內存裡面讀取字元來來顯示。
單片機晶元與該顯示器相連後,可以通過引腳往該顯示器的內存里寫數據(通過多個引腳電平的高低不同來代表不同的數據,比如說:低高高低低低低高 代表01100001,這個數據寫在顯示器的.內存裡面,被顯示器所顯示,當然,會根據ASCII來顯示數字對應的字元,01100001對應的字元是『a』),除了接收數據的引腳外,還有控制顯示器的引腳(這個我們會在驅動那裡介紹,繼續往下看)。
結論:單片機晶元與顯示器相連,可以通過引腳輸出的電平來控制顯示器的字元顯示。
那麼,綜合上面,也就是說,單片機晶元cpu可以通過執行指令來控制顯示器的字元顯示。
而這里,題主所說的硬體,指的就是這個顯示器了。
接下來講驅動:
那麼,什麼是驅動呢?驅動無非就是硬體跟軟體的中間層,但我們不糾結這種關系,直接來看一下,對於我們這個例子,驅動指的是什麼。首先我們要知道:
顯示器支持很多種操作,比如說清除顯示,游標移動,讀取數據,寫數據等等。
這些操作數據引腳和控制引腳來實現。
引腳可以通過單片機晶元來控制。
結論:我們可以通過在單片機晶元裡面寫顯示器的「驅動」程序來屏蔽掉硬體(顯示器硬體)層。
於是這里驅動程序,指的是顯示器所支持操作的程序表示。比如說清除顯示,我們可以編寫一個clear()函數,游標移動,我們編寫一個move_cursor()函數,讀取數據和寫數據分別為read()和write(),然後分別實現就可以了(通過向寄存器里寫數據的形式,進而控制引腳的電平變化,再而控制顯示器,這個過程前面已有介紹)。這些函數就是驅動程序了。為什麼上面說驅動程序可以屏蔽掉硬體呢?因為程序員可以使用前面的驅動程序來直接操作顯示器(硬體),而不用知道太多關於硬體的事情,而一般的驅動程序也可以由廠家來提供。
再說明一點:一般這些驅動程序可以用匯編寫(出於運行效率的考慮),也可以用C語言來編寫的,比如說我上面的例子,就可以直接用C語言來編寫。當然C語言內聯匯編的形式也可以。
最後講C語言怎麼操作硬體:
相信到這里,C語言是怎麼操作硬體的已經比較明白了。
這里總結一下:
C語言由CPU運行(實際上是先編譯成機器碼存在晶元裡面然後執行),可以去操作內存。
內存里有一段是跟寄存器相對應的,而寄存器是跟晶元的引腳相對應的,於是操作該段內存就能控制晶元引腳的電壓變化。
硬體(比如說顯示器)有引腳(或者說排線,這些也是一樣的東西),這些引腳跟晶元的引腳相連可以接受晶元的控制。
可以把對某個硬體的操作做成一系列操作函數,這些操作函數就是驅動程序了。
於是我們的C語言只要去調用這個驅動程序就可以直接操作硬體了。(當然驅動程序也可以由C語言來編寫,所以C語言操作硬體並不一定要經過驅動程序)。
❷ C語言中說的內存是指內存條么內存條中分為ram區和rom區么
邏輯上內存ram,包括cpu內的寄存器組、高速cache、內存條上的存儲單元(物理上內存)
內存條屬ram 不會有rom 區分 ram rom的方法是 斷電之後 丟不丟數據 不丟的就是rom 丟的就是ram
❸ 在c語言中 佔用的內存
那個一般是以前的系統了16位的
現在一般是32位
不同的計算機他們的字母
數字等所佔位元組數不同。
但是一個字元一般都只佔一個位元組
而整數一般占
2個或4個位元組
在C語言中
有個sizeof函數。
你定義個整數
i
n
int
i,n;
n=sizeof(i);
再輸出n的只看是幾
就代表幾位了。。
printf("%d",n);
字元就用
char
i;
int
n;
還有實型
float
i;
int
n;
❹ C語言字元串排序對cpu性能的影響
字元串排序過度冗餘,會導致內存空前佔用過大,導致CPU溫度上升,過熱關機。
字元串主要用於編程,概念說明、函數解釋、用法詳述見正文,這里補充一點:字元串在存儲上類似字元數組,所以它每一位的單個元素都是可以提取的,如s=「abcdefghij」,則s[1]=「b」,s[9]="j",這可以給我們提供很多方便,如高精度運算時每一位都可以轉化為數字存入數組。
中央處理器(centralprocessingunit,簡稱CPU)作為計算機系統的運算和控制核心,是信息處理、程序運行的最終執行單元。CPU自產生以來,在邏輯結構、運行效率以及功能外延上取得了巨大發展。CPU出現於大規模集成電路時代,處理器架構設計的迭代更新以及集成電路工藝的不斷提升促使其不斷發展完善。從最初專用於數學計算到廣泛應用於通用計算,從4位到8位、16位、32位處理器,最後到64位處理器,從各廠商互不兼容到不同指令集架構規范的出現,CPU自誕生以來一直在飛速發展。[
❺ 為什麼我一用C語言編程,內存就飆到100%
一用TC,CPU就滿了不是內存,是CPU飆到100%。
這是16位DOS程序的通病,由於DOS是單進程的操作系統,一個進程(即程序)要佔用全部的CPU,而TC是屬於DOS程序,所以
❻ C語言結構體占內存多少
C語言獲取變數、數據類型內存佔多少,使用sizeof運算符即可。
關於結構體所佔的內存多少,一般還要考慮對齊的問題。只所以要進行數據對齊是因為編譯器對結構的存儲的特殊處理能提高CPU存儲變數的速度,一般來說,32位的CPU內存以4位元組對齊,64位的CPU的以8位元組的對齊。一般可以使用#pragma pack()來指出對齊的位元組數。比如下面的代碼,在debug會顯示結構體test的內存大小為28,如果生成release版則所佔內存大小為32 。
#include<stdio.h>
#ifdef_DEBUG
#pragmapack(4)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#else
#pragmapack(8)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#endif
intmain(void){
printf("%d ",sizeof(ss));
return0;
}
❼ c語言的cpu佔用率
1、cpu執行一條命令的用時是固定的,例如一條printf語句在編譯成機器碼後交給cpu執行的話,cpu就需要1毫秒,這樣就是1秒列印1000個字元串(僅是舉例,實際時間可能不一樣,但大體上是固定的)。
2、某個時刻可能CPU利用率會達到100%,但因為本身windows系統是多進程的,windows負責進程間切換。所以可能看起來是,但其實還是有一些windows消息(比如滑鼠移動)的傳遞和處理,只不過大部分的cpu資源可能會被這個程序佔用了
❽ 如何通過C語言編程獲取AIX的CPU,內存使用率
內存情況比較簡單
MEMORYSTATUSEX mstx;
mstx.dwLength = sizeof (mstx);
GlobalMemoryStatusEx( &mstx );
int iMemeryUsePercentage = mstx.dwMemoryLoad;
int iTotalPhysMB = mstx.ullTotalPhys/1024/1024;
int iAvailPhysMB = mstx.ullAvailPhys/1024/1024;
int iTotalPageFileMB = mstx.ullTotalPageFile/1024/1024;
int iAvailPageFileMB = mstx.ullAvailPageFile/1024/1024;
char LogBuff[128];
memset( LogBuff , 0 , 128 );
sprintf( LogBuff , "MemAvailPct=%d%% Phys=%d/%d PageFile=%d/%d" , 100 - iMemeryUsePercentage , iAvailPhysMB , iTotalPhysMB , iAvailPageFileMB , iTotalPageFileMB );
printf("%s\n",LogBuff);
以上程序分別輸出可用百分比,可以用物理內存/總物理內存,可用頁面文件/總頁面文件
獲取CPU的比較復雜,我這邊只有獲取單個進程CPU佔用的方法,不過可以遍歷所有進程分別獲取再求和就是整個cpu佔用率了。
#include <stdio.h>
#include <Windows.h>
typedef long long int64_t;
typedef unsigned long long uint64_t;
/// 時間轉換
static uint64_t file_time_2_utc(const FILETIME* ftime)
{
❾ linux下調試編寫並調試C語言程序,怎麼查看它的內存和CPU信息GDB中可以實現嗎
可以用linux版的QT,很方便的。
❿ 寫c需要多大內存
編程對於機器來說其實要求真的不算高,只需要CPU稍微好一點然後內存有個1G就足夠了,要求不高
C語言是一種面向過程、抽象的通用程序設計語言,廣泛用於底層開發。C語言可以用一種簡單的方式編譯和處理低級內存。C語言是一種高效的編程語言,它只生成少量的機器語言,並且可以在沒有任何運行時環境支持的情況下運行。盡管C語言提供了許多低級處理能力,但它仍然是跨平台的,按照標准規范編寫的程序可以在許多計算機平台上編譯,包括嵌入式處理器和超級計算機