JPH0833828B2 - プログラム動作システム - Google Patents
プログラム動作システムInfo
- Publication number
- JPH0833828B2 JPH0833828B2 JP22714190A JP22714190A JPH0833828B2 JP H0833828 B2 JPH0833828 B2 JP H0833828B2 JP 22714190 A JP22714190 A JP 22714190A JP 22714190 A JP22714190 A JP 22714190A JP H0833828 B2 JPH0833828 B2 JP H0833828B2
- Authority
- JP
- Japan
- Prior art keywords
- program
- control table
- control
- processing
- copied
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Description
【発明の詳細な説明】 [概要] 制御ブロック(制御表)に基づいてプログラムを動作
させる時のプログラム動作システムに関し、 プログラムミスにより制御表が破壊されるのを防ぐこ
とを目的とし, トランザクション系の上位プログラムからファイルの
オープン要求が発生したら、その上位プログラム内に存
在する制御表を低位プログラムからのみアクセス可能な
システム作業域に複写し、このオープン時のタイミング
を利用して、処理依頼者の制御表と複写した制御表に双
方向ポインタを張ると共に、処理終了まで変更不可のパ
ラメータである基本パラメータを複写した制御表に残す
ように構成する。
させる時のプログラム動作システムに関し、 プログラムミスにより制御表が破壊されるのを防ぐこ
とを目的とし, トランザクション系の上位プログラムからファイルの
オープン要求が発生したら、その上位プログラム内に存
在する制御表を低位プログラムからのみアクセス可能な
システム作業域に複写し、このオープン時のタイミング
を利用して、処理依頼者の制御表と複写した制御表に双
方向ポインタを張ると共に、処理終了まで変更不可のパ
ラメータである基本パラメータを複写した制御表に残す
ように構成する。
[産業上の利用分野] 本発明は制御ブロック(制御表)に基づいてプログラ
ムを動作させる時のプログラム動作システムに関する。
ムを動作させる時のプログラム動作システムに関する。
仮想メモリ空間(VS)からCPUにより制御される主記
憶装置(MM)上に必要なプログラムを割り付け(ページ
ングし)、プログラムを動作させるシステムがある。こ
の種のシステムでは、上位プログラム又はP.P(プログ
ラムプロダクツ,一種のユーティリテイプログラム)が
低位オペレーティングシステム(SCP)の制御の下に動
作するようになっている。
憶装置(MM)上に必要なプログラムを割り付け(ページ
ングし)、プログラムを動作させるシステムがある。こ
の種のシステムでは、上位プログラム又はP.P(プログ
ラムプロダクツ,一種のユーティリテイプログラム)が
低位オペレーティングシステム(SCP)の制御の下に動
作するようになっている。
[従来の技術] 第5図は従来システムの概念図である。図において、
1は処理プログラム、2は高品位制御プログラムで、い
ずれも上位プログラムに属する。そして、これらプログ
ラムはいずれも複数存在する。3は下位の制御プログラ
ムで複数存在する。4は上位プログラム1,2と下位プロ
グラム3を仲介する制御ブロック(制御表)である。こ
の制御表4は、第6図に示すような構成となっており、
アドレスと各種引数より構成されている。
1は処理プログラム、2は高品位制御プログラムで、い
ずれも上位プログラムに属する。そして、これらプログ
ラムはいずれも複数存在する。3は下位の制御プログラ
ムで複数存在する。4は上位プログラム1,2と下位プロ
グラム3を仲介する制御ブロック(制御表)である。こ
の制御表4は、第6図に示すような構成となっており、
アドレスと各種引数より構成されている。
上位の処理プログラム1や高品位制御プログラム2
が、より低位の制御プログラム3に対して各種処理を依
頼する場合、各種の制御ブロック(制御表)4に種々の
情報を設定し、これら情報を引数として、サービス機能
を呼出している。処理依頼を受けた制御プログラム3
は、制御表4に基づき処理を実行し、処理結果(データ
や結果状態)もこの制御表4の指示に従っている。
が、より低位の制御プログラム3に対して各種処理を依
頼する場合、各種の制御ブロック(制御表)4に種々の
情報を設定し、これら情報を引数として、サービス機能
を呼出している。処理依頼を受けた制御プログラム3
は、制御表4に基づき処理を実行し、処理結果(データ
や結果状態)もこの制御表4の指示に従っている。
[発明が解決しようとする課題] 第5図に示したような従来システムでは、単発のサー
ビス依頼であれば処理中に制御表4が破壊される可能性
は低い。しかしながら、ファイル系のトランザクション
処理(取引の都度発生するような処理)においては、制
御表4が仮想空間(あるいは実空間)に長時間配置され
たままとなり、以下に示すような問題が発生する可能性
がある。
ビス依頼であれば処理中に制御表4が破壊される可能性
は低い。しかしながら、ファイル系のトランザクション
処理(取引の都度発生するような処理)においては、制
御表4が仮想空間(あるいは実空間)に長時間配置され
たままとなり、以下に示すような問題が発生する可能性
がある。
プログラムミスにより、制御表4が破壊される可能性
が高くなる。
が高くなる。
制御表4が破壊されると、次に示すような異常状態が誘
発される。
発される。
制御表4内に存在する制御プログラムの仕掛情報破壊
の場合、最悪の場合システムダウンになる場合がある。
の場合、最悪の場合システムダウンになる場合がある。
制御表4内に存在する処理プログラムの呼出しパラメ
ータ破壊の場合、制御プログラムが誤動作する場合があ
る。
ータ破壊の場合、制御プログラムが誤動作する場合があ
る。
制御表4内に存在する処理プログラムの復帰パラメー
タ破壊の場合、処理プログラムが誤動作する場合があ
る。
タ破壊の場合、処理プログラムが誤動作する場合があ
る。
制御表4のこのような不具合を予防するためには、プ
ロテクションによるガードが考えられるが、サイズのま
ちまちなユーザプログラム単位にプロテクション機能を
働かせるには高額なコストがかかってしまう。
ロテクションによるガードが考えられるが、サイズのま
ちまちなユーザプログラム単位にプロテクション機能を
働かせるには高額なコストがかかってしまう。
本発明は、このような課題に鑑みてなされたものであ
って、プログラムミスにより制御表が破壊されるのを防
ぐことができるプログラム動作システムを提供すること
を目的としている。
って、プログラムミスにより制御表が破壊されるのを防
ぐことができるプログラム動作システムを提供すること
を目的としている。
[課題を解決するための手段] 第1図は本発明の原理図である。第5図と同一のもの
は、同一の符号を付して示す。図において、10はトラン
ザクション系の上位プログラムで、第5図の処理プログ
ラム1と高品位プログラム2を含む概念である。4はこ
の上位プログラム10内に存在する制御表である。3は実
際の処理を行う制御プログラムで、オペレーティングシ
ステムSCPの制御下にある。11は制御プログラム3が実
際の処理を行う作業領域(システム作業域)である。下
位プログラムである制御プログラム3及びシステム作業
域11には上位プログラム10からアクセスできないように
プロテクションがかかっている。11aは該システム作業
域11内に移された複写制御表である。つまり、制御表11
aは上位プログラム10内に存在する制御表4をシステム
作業域11に複写したものである。従って、これら複写制
御表11aは、上位プログラム10内の制御表4に対応した
数だけ存在している。
は、同一の符号を付して示す。図において、10はトラン
ザクション系の上位プログラムで、第5図の処理プログ
ラム1と高品位プログラム2を含む概念である。4はこ
の上位プログラム10内に存在する制御表である。3は実
際の処理を行う制御プログラムで、オペレーティングシ
ステムSCPの制御下にある。11は制御プログラム3が実
際の処理を行う作業領域(システム作業域)である。下
位プログラムである制御プログラム3及びシステム作業
域11には上位プログラム10からアクセスできないように
プロテクションがかかっている。11aは該システム作業
域11内に移された複写制御表である。つまり、制御表11
aは上位プログラム10内に存在する制御表4をシステム
作業域11に複写したものである。従って、これら複写制
御表11aは、上位プログラム10内の制御表4に対応した
数だけ存在している。
[作用] トランザクション系の上位プログラム10からファイル
のオープン要求が発生したら、その上位プログラム10内
に存在する制御表4を低位プログラム3からのみアクセ
ス可能なシステム作業域11に複写し、このオープン時の
タイミングを利用して、処理依頼者の制御表4と複写し
た制御表11aに双方向ポインタを張ると共に、処理終了
まで変更不可のパラメータである基本パラメータを複写
した制御表11aに残すようにする。このように構成する
ことにより、基本パラメータは上位プログラム10からの
誤アクセスにより破壊されることがなくなる。従って、
本発明によればプログラムミスにより制御表が破壊され
るのを防ぐことができる。
のオープン要求が発生したら、その上位プログラム10内
に存在する制御表4を低位プログラム3からのみアクセ
ス可能なシステム作業域11に複写し、このオープン時の
タイミングを利用して、処理依頼者の制御表4と複写し
た制御表11aに双方向ポインタを張ると共に、処理終了
まで変更不可のパラメータである基本パラメータを複写
した制御表11aに残すようにする。このように構成する
ことにより、基本パラメータは上位プログラム10からの
誤アクセスにより破壊されることがなくなる。従って、
本発明によればプログラムミスにより制御表が破壊され
るのを防ぐことができる。
[実施例] 以下、図面を参照して本発明の実施例を詳細に説明す
る。
る。
第2図は本発明の動作説明図である。第1図と同一の
ものは、同一の符号を付して示す。図において、ユーザ
空間には上位プログラム10が含まれ、制御プログラム空
間には制御プログラム3が含まれる。このようなプログ
ラム環境では、ユーザ空間のあるジョブを概観した場
合、単一プログラムからジョブが構成されることは希で
あり、複数のプログラムが動的あるいは静的に結合され
ている場合が多い。図に示す例では、上位プログラム10
はプログラムAからプログラムDで構成されている。
ものは、同一の符号を付して示す。図において、ユーザ
空間には上位プログラム10が含まれ、制御プログラム空
間には制御プログラム3が含まれる。このようなプログ
ラム環境では、ユーザ空間のあるジョブを概観した場
合、単一プログラムからジョブが構成されることは希で
あり、複数のプログラムが動的あるいは静的に結合され
ている場合が多い。図に示す例では、上位プログラム10
はプログラムAからプログラムDで構成されている。
各プログラムには、制御表4が存在する。例えば、プ
ログラムAについては同プログラムで作成された機能X1
用の制御表4Aが、プログラムBについては同プログラム
で作成された機能X1用の制御表4Bが、プログラムCにつ
いては同プログラムで作成された機能X1用の制御表4C
が、プログラムDについては同プログラムで作成された
機能X1用の制御表4Dが、それぞれ存在する。それぞれの
制御表中に示す↑AX1,↑BX1,↑CX2,↑DX2はそれぞれの
制御表の写しへのリンクアドレスである。つまり、この
アドレスで複写された制御表へのリンクを確保してい
る。
ログラムAについては同プログラムで作成された機能X1
用の制御表4Aが、プログラムBについては同プログラム
で作成された機能X1用の制御表4Bが、プログラムCにつ
いては同プログラムで作成された機能X1用の制御表4C
が、プログラムDについては同プログラムで作成された
機能X1用の制御表4Dが、それぞれ存在する。それぞれの
制御表中に示す↑AX1,↑BX1,↑CX2,↑DX2はそれぞれの
制御表の写しへのリンクアドレスである。つまり、この
アドレスで複写された制御表へのリンクを確保してい
る。
制御プログラム空間は、制御プログラム空間1と制御
プログラム空間2に分かれている。これら制御プログラ
ム空間は、第1図の制御プログラム3及びシステム作業
域11を含む概念である。制御プログラム空間1には、機
能X1を実現するためのプログラム12と、制御表4A,4Bの
写しの制御表である11A,11Bが含まれる。制御プログラ
ム空間2には、機能X2を実現するためのプログラム13
と、制御表4C,4Dの写しの制御表である11C,11Dが含まれ
る。それぞれの制御表中に示す↓AX1,↓BX1,↓CX2,↓DX
2はそれぞれの元の制御表へのリンクアドレスである。
プログラム空間2に分かれている。これら制御プログラ
ム空間は、第1図の制御プログラム3及びシステム作業
域11を含む概念である。制御プログラム空間1には、機
能X1を実現するためのプログラム12と、制御表4A,4Bの
写しの制御表である11A,11Bが含まれる。制御プログラ
ム空間2には、機能X2を実現するためのプログラム13
と、制御表4C,4Dの写しの制御表である11C,11Dが含まれ
る。それぞれの制御表中に示す↓AX1,↓BX1,↓CX2,↓DX
2はそれぞれの元の制御表へのリンクアドレスである。
つまり、このアドレスで元の制御表4A,4B,4C,4Dへの
リンクを確保している。このことは、処理依頼者の制御
表4A,4B,4C,4Dと複写した制御表11A,11B,11C,11Dに双方
向ポインタを張っていることになる。また、複写した制
御表11A,11B,11C,11Dには、基本パラメータ(処理終了
まで変更不可のパラメータ)が保存されている。低位制
御プログラムのみアクセス可能な領域(システム作業域
11)に配置された複写制御表は、システムプロテクショ
ン機構により、一般プログラムからの破壊に対する抵抗
力が強く、例え破壊されても原因プログラムの特定は容
易である。
リンクを確保している。このことは、処理依頼者の制御
表4A,4B,4C,4Dと複写した制御表11A,11B,11C,11Dに双方
向ポインタを張っていることになる。また、複写した制
御表11A,11B,11C,11Dには、基本パラメータ(処理終了
まで変更不可のパラメータ)が保存されている。低位制
御プログラムのみアクセス可能な領域(システム作業域
11)に配置された複写制御表は、システムプロテクショ
ン機構により、一般プログラムからの破壊に対する抵抗
力が強く、例え破壊されても原因プログラムの特定は容
易である。
このように構成されたシステムで、ユーザプログラム
10はトランザクション系のファイルオープンを要求す
る。第3図はファイルアクセス時のフローチャートであ
る。先ず、ファイルのオープン(OPEN)要求を行い(S
1)、次にデータの書き込み(ライト)を行う(S2)。
次に、データの読み込み(リード)を行い(S3)、ファ
イルのクローズ(CLOSE)を行う(S4)。オープン要求
時、基本制御表をシステム作業域11に複写する。例え
ば、制御表4Aを複写して制御表11Aを作る。オープン要
求は該当制御表の初回依頼であり、破壊の可能性は極め
て低い。このタイミングを利用して、制御表複写時に次
の処置を施しておく。
10はトランザクション系のファイルオープンを要求す
る。第3図はファイルアクセス時のフローチャートであ
る。先ず、ファイルのオープン(OPEN)要求を行い(S
1)、次にデータの書き込み(ライト)を行う(S2)。
次に、データの読み込み(リード)を行い(S3)、ファ
イルのクローズ(CLOSE)を行う(S4)。オープン要求
時、基本制御表をシステム作業域11に複写する。例え
ば、制御表4Aを複写して制御表11Aを作る。オープン要
求は該当制御表の初回依頼であり、破壊の可能性は極め
て低い。このタイミングを利用して、制御表複写時に次
の処置を施しておく。
処理依頼者の制御表と複写した制御表に双方向性ポイ
ンタを張る。図の↑AX1と↓AX1がそれである。
ンタを張る。図の↑AX1と↓AX1がそれである。
これにより、処理依頼時に両制御表がポイントされて
いなければ、制御表破壊である。例えば、プログラムA
で発行される機能X1への要求制御表が、プログラムCの
誤りにより破壊された場合、破壊後の機能X1呼出し時、
機能X1は双方向リンクチェック及び基本パラメータのチ
ェック等を実施し、制御表4Aの破壊を検出する。この
時、機能X1はこれ以上の本ジョブ走行を危険と判断し、
該当ジョブを異常終了させる手続きをとり、オペレータ
及びプログラマにプログラムAの異常を通知する。
いなければ、制御表破壊である。例えば、プログラムA
で発行される機能X1への要求制御表が、プログラムCの
誤りにより破壊された場合、破壊後の機能X1呼出し時、
機能X1は双方向リンクチェック及び基本パラメータのチ
ェック等を実施し、制御表4Aの破壊を検出する。この
時、機能X1はこれ以上の本ジョブ走行を危険と判断し、
該当ジョブを異常終了させる手続きをとり、オペレータ
及びプログラマにプログラムAの異常を通知する。
基本パラメータ(処理終了まで変更不可のパラメー
タ)を複写した制御表、例えば11Aに残す。
タ)を複写した制御表、例えば11Aに残す。
これにより、処理受付毎に検証し、オープン時と異な
っていれば制御表破壊である。
っていれば制御表破壊である。
本発明によれば、利用者プログラム(例えば前記プロ
グラムA)が異常終了したとしても、依頼者の制御表が
存在しなくても、複写制御表が存在しているので、ファ
イルの代行クローズ処理が可能となる。ファイルがオー
プンしてライトしっぱなしとなりクローズしないような
異常終了時、それまでに蓄積されたデータが無効とな
り、リカバリに莫大なコストを要する場合もあるが、本
発明では複写制御表をもっているので、このような状態
も未然に回避可能である。
グラムA)が異常終了したとしても、依頼者の制御表が
存在しなくても、複写制御表が存在しているので、ファ
イルの代行クローズ処理が可能となる。ファイルがオー
プンしてライトしっぱなしとなりクローズしないような
異常終了時、それまでに蓄積されたデータが無効とな
り、リカバリに莫大なコストを要する場合もあるが、本
発明では複写制御表をもっているので、このような状態
も未然に回避可能である。
第4図は本発明が適用されるメモリ環境を示す図であ
る。各プログラム(制御プログラム,アプリケーショ
ン)や制御域,リクエストブロックは全てページに分割
され(図の格子)、仮想メモリVSに展開されている。つ
まり、オペレーティングシステムSCP,システム作業域SW
A及びジョブ域が仮想空間VSに展開されている。仮想メ
モリVSとしては、例えばDASDが用いられる。これら展開
された領域のうち、必要な部分のみがページングで主記
憶装置MM上に配置される。
る。各プログラム(制御プログラム,アプリケーショ
ン)や制御域,リクエストブロックは全てページに分割
され(図の格子)、仮想メモリVSに展開されている。つ
まり、オペレーティングシステムSCP,システム作業域SW
A及びジョブ域が仮想空間VSに展開されている。仮想メ
モリVSとしては、例えばDASDが用いられる。これら展開
された領域のうち、必要な部分のみがページングで主記
憶装置MM上に配置される。
主記憶装置MMにはプロテクションがかかっており、低
位からのストア命令はOKであるが、高位からのストア命
令はプログラム割り込みが発生し、命令が実行されずに
プログラムを異常終了させる。このような機構を利用
し、リクエストブロック(制御表)を一般アプリケーシ
ョンやP.P(プログラムプロダクツ)から保護可能なシ
ステム作業域SWAにコピーし、制御プログラムはこのSWA
領域により処理を行うようになっている。
位からのストア命令はOKであるが、高位からのストア命
令はプログラム割り込みが発生し、命令が実行されずに
プログラムを異常終了させる。このような機構を利用
し、リクエストブロック(制御表)を一般アプリケーシ
ョンやP.P(プログラムプロダクツ)から保護可能なシ
ステム作業域SWAにコピーし、制御プログラムはこのSWA
領域により処理を行うようになっている。
[発明の効果] 以上、詳細に説明したように、本発明によればファイ
ルオープン要求時に基本制御表をシステム作業域に複写
しておくことにより、プログラムミスにより制御表が破
壊されるのを防ぐことができる。このようにして複写制
御表が確保できるので、ファイル代行クローズ処理が可
能となり、リカバリ処理コストを軽減することができ
る。更に、本発明によれば比較的早いタイミングで制御
表の破壊を検出することができ、2次障害が発生しにく
いという特長もある。
ルオープン要求時に基本制御表をシステム作業域に複写
しておくことにより、プログラムミスにより制御表が破
壊されるのを防ぐことができる。このようにして複写制
御表が確保できるので、ファイル代行クローズ処理が可
能となり、リカバリ処理コストを軽減することができ
る。更に、本発明によれば比較的早いタイミングで制御
表の破壊を検出することができ、2次障害が発生しにく
いという特長もある。
第1図は本発明の原理図、 第2図は本発明の動作説明図、 第3図はファイルアクセス時のフローチャート、 第4図は本発明が適用されるメモリ環境を示す図、 第5図は従来システムの概念図、 第6図は制御表の構成例を示す図である。 第1図において、3は制御プログラム、4は制御表、10
は上位プログラム、11はシステム作業域、11aは複写制
御表である。
は上位プログラム、11はシステム作業域、11aは複写制
御表である。
Claims (1)
- 【請求項1】トランザクション系の上位プログラム(1
0)からファイルのオープン要求が発生したら、その上
位プログラム(10)内に存在する制御表(4)を低位プ
ログラム(3)からのみアクセス可能なシステム作業域
(11)に複写し、 このオープン時のタイミングを利用して、処理依頼者の
制御表(4)と複写した制御表(11a)に双方向ポイン
タを張ると共に、 処理終了まで変更不可のパラメータである基本パラメー
タを複写した制御表(11a)に残すように構成したこと
を特徴とするプログラム動作システム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP22714190A JPH0833828B2 (ja) | 1990-08-29 | 1990-08-29 | プログラム動作システム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP22714190A JPH0833828B2 (ja) | 1990-08-29 | 1990-08-29 | プログラム動作システム |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH04107740A JPH04107740A (ja) | 1992-04-09 |
JPH0833828B2 true JPH0833828B2 (ja) | 1996-03-29 |
Family
ID=16856130
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP22714190A Expired - Fee Related JPH0833828B2 (ja) | 1990-08-29 | 1990-08-29 | プログラム動作システム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JPH0833828B2 (ja) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7676704B2 (en) * | 2007-06-29 | 2010-03-09 | Symantec Corporation | Resource management for scalable file system recovery |
-
1990
- 1990-08-29 JP JP22714190A patent/JPH0833828B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JPH04107740A (ja) | 1992-04-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5675725A (en) | Computer backup system operable with open files | |
US5546534A (en) | Method of operating a computer system | |
US4486831A (en) | Multi-programming data processing system process suspension | |
US6779132B2 (en) | Preserving dump capability after a fault-on-fault or related type failure in a fault tolerant computer system | |
JPH0619798A (ja) | セレクタの値のロードを回避する方法とシステム | |
US5873124A (en) | Virtual memory scratch pages | |
US20050015672A1 (en) | Identifying affected program threads and enabling error containment and recovery | |
CA2551045C (en) | Input-output control apparatus, input-output control method, process control apparatus and process control method | |
US6697959B2 (en) | Fault handling in a data processing system utilizing a fault vector pointer table | |
KR100791815B1 (ko) | 컴퓨터 시스템 및 컴퓨터 시스템에서 인스트럭션을 실행하는 방법 | |
JPH0833828B2 (ja) | プログラム動作システム | |
EP0117930B1 (en) | Interactive work station with auxiliary microprocessor for storage protection | |
US6687845B2 (en) | Fault vector pointer table | |
KR100285534B1 (ko) | 컴퓨터 시스템의 작동방법 | |
WO1990005951A1 (en) | Method of handling unintended software interrupt exceptions | |
AU695339C (en) | Computer backup system operable with open files | |
JPH0219508B2 (ja) | ||
JPH01265341A (ja) | メモリアクセス制御装置 | |
JPH03113548A (ja) | 拡張メモリ制御装置 | |
JPH04364545A (ja) | メモリダンプ方法 | |
JPS592297A (ja) | 共有メモリのプロテクシヨン方法 | |
GB2290396A (en) | Backing-up shared data | |
NZ331685A (en) | Computer backup system for open files by permitting simultaneous read access to a file by both the backup read operation and the normal read operation | |
JPH0471050A (ja) | スタック領域保護回路 | |
JPH03188551A (ja) | 非同期処理用メモリ保護方式 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
LAPS | Cancellation because of no payment of annual fees |