❶ 如何得到linux的pagesize
#include#include#defineONE_MB(1024*1024)intmain(void){longnum_procs;longpage_size;longnum_pages;longfree_pages;longlongmem;longlongfree_mem;num_procs=sysconf(_SC_NPROCESSORS_CONF);printf("CPU個數為:%ld個\n"蘆空,num_procs);page_size=sysconf(_SC_PAGESIZE);printf("系統頁面的大小為:%ldK\n",page_size/1024);num_pages=sysconf(_SC_PHYS_PAGES);printf("系統中物理頁數個數:%ld個\前念n",num_pages);free_pages=sysconf(_SC_AVPHYS_PAGES);printf("系統中可用的頁面個數為:%ld個\n",free_pages);mem=(longlong)((longlong)num_pages*(longlong)page_size);mem/=ONE_MB;free_mem=(longlong)free_pages*(longlong)page_size;free_mem/=ONE_MB;printf("總共有%lldMB的物理內存,空閑的陪悔瞎物理內存有:%lldMB\n",mem,free_mem);return(0);}
❷ linux c怎麼實現從文件的最後一行一行向前讀文件
下面的例子使用mmap讀最後20行(假設最後20行不會超過1024位元組)
/*-
* Copyright (C), 1988-2014, mymtom
*
* vi:set ts=4 sw=4:
*/
#ifndef lint
static const char rcsid[] = "$Id$";
#endif /* not lint */
/**
* @file last20.c
* @brief
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
char *memchrr(const void *v1, const char *v2, int c)
{
char *s1, *s2;
char *p;
s1 = (char *)v1;
s2 = (char *)v2;
for (p = s2; p >= s1; --p) {
if (*p == c)
return p;
}
return NULL;
}
#define READSIZE 1024
int main(int argc, char *argv[])
{
int ret;
FILE *fp;
char *addr;
size_t len;
int prot;
int flags;
int fd;
off_t off;
off_t rem;
long pagesize;
struct stat buf;
pagesize = sysconf(_SC_PAGESIZE);
fp = fopen("last20.c", "rb");
fd = fileno(fp);
ret = fstat(fd, &buf);
if (buf.st_size <= READSIZE || buf.st_size <= pagesize) {
off = 0;
len = buf.st_size;
} else {
off = buf.st_size - READSIZE;
rem = off % pagesize;
off = off - rem;
len = READSIZE + rem;
}
/*
printf("size=%d READSIZE=%d off=%d len=%d\n",
(int)buf.st_size, (int)READSIZE, (int)off, (int)len);
*/
prot = PROT_READ;
flags = MAP_PRIVATE;
addr = mmap(NULL, len, prot, flags, fd, off);
fclose(fp);
{
int i, n;
char *head, *tail;
size_t size;
char line[1024];
tail = addr + len - 1;
n = 20;
for (i = 0; i < n; ++i) {
head = memchrr(addr, tail - 1, '\n');
if (head == NULL) {
size = tail - addr;
memcpy(line, addr, size);
line[size] = '\0';
} else {
size = tail - head - 1;
memcpy(line, head + 1, size);
line[size] = '\0';
tail = head;
}
printf("%s\n", line);
if (head == NULL) {
break;
}
}
}
munmap(addr, len);
return 0;
}
運行結果為:
./last20 | tac | cat -n
line[size] = '\0';
} else {
size = tail - head - 1;
memcpy(line, head + 1, size);
line[size] = '\0';
tail = head;
}
printf("%s\n", line);
if (head == NULL) {
break;
}
}
}
munmap(addr, len);
return 0;
}
❸ 如何查看linux pagesize的大小
使用getconf命令即可查看pagesize的大小 ,命令如下:
getcon PAGESIZE
執行結果如下圖所示:
擴展:getconf命令詳解
用途:將系統配置變數值寫入標准輸出。
語法:getconf[-vspecification] [SystemwideConfiguration|PathConfigurationPathName] [DeviceVariableDeviceName]
getconf-a
參數:
-a規格 顯示了指定規格及版本,其配置變數等待確定。如果該標志未被指定,返回值將響應一個實現預設值 XBS5 的相應的編輯環境。
-v 將全部系統配置變數值寫入標准輸出。
參數
PathName 為PathConfiguration參數指定路徑名。
SystemwideConfiguration 指定一個系統配置變數。
PathConfiguration 指定一個系統路徑配置變數。
DeviceName 指定一個設備路徑名。
DeviceVariable 指定一個設備變數。
當列入下列的表格中的第一列符號被用作system_var操作數時,getconf將產生與用第二列的值調用confstr時相同的值:
❹ 我在linux下的db2 10.5版本創建表空間遇到蛋疼的問題求教啊
file '/db2/data' 200M 這個路徑無效。
dbapth指定為/db2/data,那這是一個目錄。在創建tablespace的時候又把它當file用,所以無效。
換一鬧坦個襲鬧別的文件名字就行拍彎罩。
❺ Linux系統如何查看Block size和page size
查看os系統塊的大小 [root@dg1 ~]# tune2fs -l /dev/sda1 |grep 'Block size' Block size: 4096 [root@dg1 ~]# 查看os系統頁的大小 [root@dg1 ~]# getconf PAGESIZE4096[root@dg1 ~]# 修改塊的大小: 創建文件系統時,可以指定塊的大小。如果將來在你的文件系統晌空中是一些比較大的文件的話,使用較大的塊大小將得到較好的性能。將ext2文件系統的塊大小調整為4096byte而不是預設的1024byte,可以減少文件碎片,加快fsck掃描的速度和文件刪除以及讀操作的速度。另外,在ext2的文件系統中,為根目錄保留了5%的空間,對一個大的文件系統,除非用作日誌文件,5%的比亮謹叢例有些過多。可以使用命令 # mke2fs -b 4096 -m 1 /dev/hda6 將它改為1%並以塊大小4096byte創建文件系統。 使用多大的塊大小,需要根據你的系敬櫻統綜合考慮,如果系統用作郵件或者新聞伺服器,使用較大的塊大小,雖然性能有所提高,但會造成磁碟空間較大的浪費。比如文件系統中的文件平均大小為 2145byte,如果使用4096byte的塊大小,平均每一個文件就會浪費1951byte空間。如果使用1024byte的塊大小,平均每一個文件會浪費927byte空間。在性能和磁碟的代價上如何平衡,要看具體應用的需要。
❻ linux kernel pagesize是什麼意思
將pagesize減一後取反,然後和addr做與運算。實現addr進行頁對齊。
❼ Linux下怎樣在進程中獲取虛擬地址對應的物理地址
Linux文件目錄中的/proc記錄著當前進程的信息,稱其為虛擬文件系統。在/proc下有一個鏈接目錄名為self,這意味著哪一個進程打開了它,self中存儲的信息就是所鏈接進程的。self中有一個名為page_map的文件,專門用來記錄所鏈接進程的物理頁號信息。這樣通過/proc/pid/page_map文件,允許一個用戶態的進程查看到每個虛擬頁映射到的物理頁
/proc/pid/page_map中的每一項都包含了一個64位的值,這個值內容如下所示。每一項的映射方式不同於真正的虛擬地址映射,其文件中遵循獨立的對應關系,即虛擬地址相對於0x0經過的頁面數是對應項在文件中的偏移量
* /proc/pid/pagemap. This file lets a userspace process find out which
physical frame each virtual page is mapped to. It contains one 64-bit
value for each virtual page, containing the following data (from
fs/proc/task_mmu.c, above pagemap_read):
* Bits 0-54 page frame number (PFN) if present//present為1時,bit0-54表示物理頁號
* Bits 0-4 swap type if swapped
* Bits 5-54 swap offset if swapped
* Bit 55 pte is soft-dirty (see Documentation/vm/soft-dirty.txt)
* Bit 56 page exclusively mapped (since 4.2)
* Bits 57-60 zero
* Bit 61 page is file-page or shared-anon (since 3.5)
* Bit 62 page swapped
* Bit 63 page present//如果為1,表示當前物理頁在內存中;為0,表示當前物理頁不在內存中
在計算物理地址時,只需要找到虛擬地址的對應項,再通過對應項中的bit63判斷此物理頁是否在內存中,若在內存中則對應項中的物理頁號加上偏移地址,就能得到物理地址
通過程序獲取物理地址並驗證寫時拷貝技術
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdint.h>
//計算虛擬地址對應的地址,傳入虛擬地址vaddr,通過paddr傳出物理地址
void mem_addr(unsigned long vaddr, unsigned long *paddr)
{
int pageSize = getpagesize();//調用此函數獲取系統設定的頁面大小
unsigned long v_pageIndex = vaddr / pageSize;//計算此虛擬地址相對於0x0的經過的頁面數
unsigned long v_offset = v_pageIndex * sizeof(uint64_t);//計算在/proc/pid/page_map文件中的偏移量
unsigned long page_offset = vaddr % pageSize;//計算虛擬地址在頁面中的偏移量
uint64_t item = 0;//存儲對應項的值
int fd = open("/proc/self/pagemap", O_RDONLY);。。以只讀方式打開/proc/pid/page_map
if(fd == -1)//判斷是否打開失敗
{
printf("open /proc/self/pagemap error
");
return;
}
if(lseek(fd, v_offset, SEEK_SET) == -1)//將游標移動到相應位置,即對應項的起始地址且判斷是否移動失敗
{
printf("sleek error
");
return;
}
if(read(fd, &item, sizeof(uint64_t)) != sizeof(uint64_t))//讀取對應項的值,並存入item中,且判斷讀取數據位數是否正確
{
printf("read item error
");
return;
}
if((((uint64_t)1 << 63) & item) == 0)//判斷present是否為0
{
printf("page present is 0
");
return ;
}
uint64_t phy_pageIndex = (((uint64_t)1 << 55) - 1) & item;//計算物理頁號,即取item的bit0-54
*paddr = (phy_pageIndex * pageSize) + page_offset;//再加上頁內偏移量就得到了物理地址
}
const int a = 100;//全局常量
int main()
{
int b = 100;//局部變數
static c = 100;//局部靜態變數
const int d = 100;//局部常量
char *str = "Hello World!";
unsigned long phy = 0;//物理地址
char *p = (char*)malloc(100);//動態內存
int pid = fork();//創建子進程
if(pid == 0)
{
//p[0] = '1';//子進程中修改動態內存
mem_addr((unsigned long)&a, &phy);
printf("pid = %d, virtual addr = %x , physical addr = %x
", getpid(), &a, phy);
}
else
{
mem_addr((unsigned long)&a, &phy);
printf("pid = %d, virtual addr = %x , physical addr = %x
", getpid(), &a, phy);
}
sleep(100);
free(p);
waitpid();
return 0;
}
測試結果如下:
全局常量:符合寫時拷貝技術
子進程修改動態內存
*其實想要知道虛擬地址對應的物理地址,通過這樣的方式也可以得到物理地址而不用操作MMU。。。*
以上就是Linux下怎樣在進程中獲取虛擬地址對應的物理地址的全文介紹,希望對您學習和使用linux系統開發有所幫助.
❽ linux執行db2 sql的sh腳本操作中斷
oracle 10g的DBMS_XPLAN包中display_cursor函數不同於display函數,display_cursor用於顯示SQL語句的真實的執行計劃,在大多數情況下,
顯示真實的執行計劃有助於更好的分析SQL語句的全過程,尤其是運行此SQL語句實時的I/O開銷。通過對比預估的I/O與真實的I/O開銷來判斷
SQL語句所存在問題,如缺少統計信息,SQL語句執行的次數,根據實際中間結果集的大小來選擇合適的連接方式等。本文僅僅講述
display_cursor函數的使用。
一、display_cursor函數用法
1、display_cursor函數語法
DBMS_XPLAN.DISPLAY_CURSOR(
sql_id IN VARCHAR2 DEFAULT NULL,
cursor_child_no IN NUMBER DEFAULT NULL,
format IN VARCHAR2 DEFAULT 'TYPICAL');
2、display_cursor函數參數描述
sql_id
指定位於庫緩存執行計劃中SQL語句的父游標。默認值為null。當使用默認值時當前會話的最後一條SQL語句的執行計劃將被返回
可以通過查詢V$SQL 或V$SQLAREA的SQL_ID列來獲得SQL語句的SQL_ID。
cursor_child_no
指定父游標下子游標的序號。即指定被返回執行計劃的SQL語句的子游標。默認值為0。如果為null,則sql_id所指父游標下所有子游標
的執行計劃都將被返回。
format
控制SQL語句執行計劃的輸出部分,即哪些可以顯示哪些不顯示。使用與display函數的format參數與修飾符在這里同樣適用。
除此之外當在開啟statistics_level=all時或使用gather_plan_statistics提示可以獲得執行計劃中實時的統計信息
有關詳細的format格式描述請參考:dbms_xplan之display函數的使用 中format參數的描述
下面給出啟用統計信息時format新增的修飾符
iostats 控制I/O統計的顯示
last 默認,顯示所有執行計算過的統計。如果指定該值,則只顯示最後一次執行的統計信息
memstats 控制pga相關統計的顯示
allstats 此為iostats memstats的快捷方式,即allstats包含了iostats和memstats
run_stats_last 等同於iostats last。只能用於oracle 10g R1
run_stats_tot 等同於iostats。只能用於oracle 10g R1
抓一個最近一小時最消耗IO的SQL:
SELECT sql_id, COUNT(*)
FROM gv$active_session_history ash, gv$event_name evt
WHERE ash.sample_time > SYSDATE - 1 / 24
AND ash.session_state = 'WAITING'
AND ash.event_id = evt.event_id
AND evt.wait_class = 'User I/O'
GROUP BY sql_id
ORDER BY COUNT(*) DESC;
執行上面的SQL:
SQL> SELECT sql_id, COUNT(*)
FROM gv$active_session_history ash, gv$event_name evt
2 3 WHERE ash.sample_time > SYSDATE - 1 / 24
4 AND ash.session_state = 'WAITING'
5 AND ash.event_id = evt.event_id
6 AND evt.wait_class = 'User I/O'
7 GROUP BY sql_id
8 ORDER BY COUNT(*) DESC;
SQL_ID COUNT(*)
------------- ----------
g7fu6qba82m6b 668
63r47zyphdk06 526
9f5m4wd88nc1h 514
593p47drw5fhk 232
br91w16jzy4fu 120
4fvwyjpnh6tp7 78
gm0nrbfuj8kzr 70
2184k363hw4xd 68
gc4dajs7g5myy 46
8vrk9sfuwfdgq 42
ccpnb4dwdmq21 40
查看SQL的執行計劃:
SELECT * FROM TABLE(dbms_xplan.display_cursor('g7fu6qba82m6b'));
在SQLPLUS中執行:
SQL> set pagesize 2000
SQL> SELECT * FROM TABLE(dbms_xplan.display_cursor('g7fu6qba82m6b'));
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
SQL_ID g7fu6qba82m6b, child number 0
-------------------------------------
UPDATE "CPDDS_PDATA"."CDM_LEDGER" SET "CSTM_NAME" = :a1,"CSTM_NO" =
:a2,"PAPER_TYPE" = :a3,"PAPER_NO" = :a4,"CURR_TYPE" = :a5,"SVT_NO" =
:a6,"BAL_DIR" = :a7,"BAL" = :a8,"AVAL_BAL" = :a9,"NORM_FRATIO" =
:a10,"PK_BAL" = :a11,"DR_ACCU" = :a12,"CR_ACCU" = :a13,"LAST_TRAN_DATE" =
:a14,"LAST_TRAN_TIME" = :a15,"PRT_LINE_NUM" = :a16,"NOREG_PK_REC_NUM" =
:a17,"PK_NO" = :a18,"PWD" = :a19,"FLAG" = :a20,"FRZ_FLAG" =
:a21,"CARD_HOLD_FLAG" = :a22,"PK_HOLD_FLAG" = :a23,"BGN_INT_DATE" =
:a24,"OPEN_DATE" = :a25,"ACC_HOLD_FLAG" = :a26,"CLS_DATE" =
:a27,"OPEN_TLR" = :a28,"CLS_TLR" = :a29,"CLS_INT" = :a30,"OPEN_INST" =
:a31,"ADD_NUM" = :a32,"DAC" = :a33,"FRZ_TIMES1" = :a34,"FRZ_TIMES2" =
:a35,"HOST_SEQNO" = :a36,"D_UPDATE_DATE" = :a37 WHERE "ACC" = :b0
Plan hash value: 319441092
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | | | 3 (100)| |
| 1 | UPDATE | CDM_LEDGER | | | | |
|* 2 | INDEX UNIQUE SCAN| I_CDM_LEDGER | 1 | 269 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("ACC"=:B0)
29 rows selected.
總結
1、與display函數不同,display_cursor顯示的為真實的執行計劃
2、對於format參數,使用與display函數的各個值,同樣適用於display_cursor函數
3、當statistics_level為all或使用gather_plan_statistics提示可以獲得執行時的統計信息
4、根據真實與預估的統計信息可以初步判斷SQL效率低下的原因,如統計信息的准確性、主要的開銷位於那些步驟等
❾ 如何將在Linux下導出的db2資料庫還原到windows下
只能用
db2look
+db2move
進行遷移。
1.提取DDL
用如下命令
db2look
-d
yn
-e
-l
-o
db2look_yn.ddl
//提取出
yn(雲南)
這個資料庫
所有用戶對象,包括表空間等。
2.用db2move
導出數據
如下
如你在
db2inist1
用戶目錄下
建立一個
data
目錄
然後執行
db2move
yn
export
在data
目錄下
會有好多
後綴名為ixf
和msg
的文件,其中ixf為數據表文件,msg後綴的為消息文件,其中最重要的
是db2move.lst
存放導出表和消息文件羨族粗的對應關系。
3.去windows
下建立一個資料庫
db2
「
create
db
yn
pagesize
8
k」
//這里的pagesize需兄鎮要和
ddl的統一
然後修改
yn.ddl
文件下
把
Linux下面
的路徑
替換為Windows
的路徑然後執行db2
-tvf
yn.ddl
4.導入資料庫
db2move
yn
load
其中會生成
一個load.out的文件
記錄錯誤信息或者
導入失敗穗汪的表
,如載入了多少行,拒絕多少行
等。
5.查看load.out
找到那些導入不成功的進行
處理,然後倒入。然後進行完整性約束
這些檢查。如有問題
Q
我吧。
❿ linux裡面虛擬內存和swap有什麼區別
為了提高磁碟存取效率, Linux做了一些精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換), 還採取了兩種主要Cache方式:Buffer Cache和Page Cache.前者針對磁碟塊的讀寫,後者針對文件inode的讀寫.這些Cache有效縮短了I/O系統調用(比如 read,write,getdents)的時間.
內存活動基本上可以用3個數字來量化:活動虛擬內存總量,交換(swapping)率和調頁(paging)率.其中第一個數字表明內存的總需求量,後兩個數字表示那些內存中有多少比例正處在使用之中.目標是減少內存活動或增加內存量,直到調頁率保持在一個可以接受的水平上為止.
活動虛擬內存的總量(VM)=實際內存大小(size of real memory)(物理內存)+使用的交換空間大小(amount of swap space used)
當程序運行需要的內存大於物理內存時,Linux系統採用了調頁機制,即系統一些內存中的頁面到磁碟上,騰出來空間供進程使用。
大多數系統可以忍受偶爾的調頁,但是頻繁的調頁會使系統性能急劇下降。
Linux內存管理:Linux系統通過2種方法進行內存管理,「調頁演算法」,「交換技術」。
調頁演算法是將內存中最近不常使用的頁面換到磁碟上,把常使用的頁面(活動頁面)保留在內存中供進程使用。
交換技術是系統將整個進程,而不是部分頁面,全部換到磁碟上。正常情況下,系統會發生一些交換過程。
當內存嚴重不足時,系統會頻繁使用調頁和交換,這增加了磁碟I/O的負載。進一步降低了系統對作業的執行速度,即系統I/O資源問題又會影響到內存資源的分配。
Linux的虛擬內存是一個十分復雜的子系統,它實現了進程間代碼與數據共享機制的透明性,並能夠分配比系統現有物理內存更多的內存,某些操作系統的虛存甚至能通過提供緩存功能影響到文件系統的性能,各種風格的Linux的虛存的實現方式區別很大,但都離不開下面的4個概念。
1:實際內存
實際內存是指一個系統中實際存在的物理內存,稱為RAM。實際內存是存儲臨時數據最快最有效的方式,因此必須盡可能地分配給應用程序,現在的RAM的形式有多種:SIMM、DIMM、Rambus、DDR等,很多RAM都可以使用糾錯機制(ECC)。
2:交換空間
交換空間是專門用於臨時存儲內存的一塊磁碟空間,通常在頁面調度和交換進程數據時使用,通常推薦交換空間的大小應該是物理內存的二到四倍。
3:頁面調度
頁面調度是指從磁碟向內存傳輸數據,以及相反的過程,這個過程之所以被稱為頁面調度,是因為Linux內存被平均劃分成大小相等的頁面;通常頁面大小為 4KB和8KB(在Solaris中可以用pagesize命令查看)。當可執行程序開始運行時,它的映象會一頁一頁地從磁碟中換入,與此類似,當某些內存在一段時間內空閑,就可以把它們換出到交換空間中,這樣就可以把空閑的RAM交給其他需要它的程序使用。
4:交換
頁面調度通常容易和交換的概念混淆,頁面調度是指把一個進程所佔內存的空閑部分傳輸到磁碟上,而交換是指當系統中實際的內存已不夠滿足新的分配需求時,把整個進程傳輸到磁碟上,交換活動通常意味著內存不足。
vmstat監視內存性能:該命令用來檢查虛擬內存的統計信息,並可顯示有關進程狀態、空閑和交換空間、調頁、磁碟空間、CPU負載和交換,cache刷新以及中斷等方面的信息。